2010-04-12 5 views
0

Я работаю с довольно большой кодовой базой, которая отлично компилируется в Linux, но vC++ 2008 сплевывает ошибки.Как вы создаете конструкцию на месте структуры, скомпилированной в массив, в Visual C++ 2008?

Код проблема выглядит следующим образом:

Декларация:
typedef float vec_t;
typedef vec_t vec2_t[2];

кодовая завален строительства на месте как этот:
(vec2_t){0, divs}

Или более сложные :
(vec2_t){ 1/(float)Vid_GetScreenW(), 1/(float)Vid_GetScreenH()}

Насколько я знаю, этот код создает структуру, затем преобразует ее в массив и передает адрес функции. Я лично никогда не использовал конструкцию на месте, так что я понятия не имею, как заставить эту работу работать.

Компилятор выдает кучу ошибок синтаксиса, подобные этим:
Error 2 error C2143: syntax error : missing ')' before '{'
Error 3 error C2059: syntax error : ')'
Error 4 error C2143: syntax error : missing ';' before '{'

не поддерживают Линукс сборки, только окна один. И я не могу его скомпилировать. Есть ли какой-то переключатель, какой-то макрос, чтобы компилировать его в vC++?

Возможно, существует такой же отличный способ построить эти массивы и передать их функциям на месте, которые компилируются просто в vC++?

+0

Какая ошибка возникает при попытке скомпилировать его? –

+0

Пожалуйста, разместите полный фрагмент кода, который компилируется на одной машине, а не другой. –

+0

Это отличный пример того, как нестандартные расширения компилятора препятствуют переносимости. К сожалению, многие люди Linux считают мобильность приоритетом при переходе с Windows на Linux, но не в другом направлении. Лучшее решение - заставить их удалить нестандартное использование расширений из своей кодовой базы; Я желаю вам удачи в убеждении их сделать это. –

ответ

1

Вы используете расширение GCC, что MSVC просто не поддерживает, "compound literals", также называемый «конструктор выражений» в старых документации GCC.

Если вам нужен переносимый код, я думаю, вам нужно будет изменить код, чтобы объявить структуры нормально и инициализировать их инициализаторами, которые имеют выражения констант или используют стандартные назначения (или использовать что-то вроде MinGW как ваш компилятор Windows, если это сделает трюк).

0

Если вы просто хотите скомпилировать свои коды под Windows и не использовать MSVC, попробуйте ли вы использовать GCC? это может быть вызвано конкретными расширениями GCC.

typedef float vec_t; 
typedef vec_t vec2_t[2]; 

vec_t Vid_GetScreenW() 
{ 
    return 600.f; 
} 
vec_t Vid_GetScreenH() 
{ 
    return 300.f; 
} 
int main() { 
    vec_t divs = 3.f; 

    //The codebase is littered with in-place construction like this one: 
    vec_t* vec1 = (vec2_t){0, divs}; 

    //Or more complex: 
    vec_t* vec2 = 
      (vec2_t){ 1/(float)Vid_GetScreenW(), 1/(float)Vid_GetScreenH()}; 
    return 0; 
} 

Сниппет выше компилируется г ++ (MinGW) под Windows XP и произвести следующее сообщение об ошибке с помощью cl.exe:

E: \ TMP> г ++ vec.cc

E: \ TMP> сл vec.cc Microsoft (R) 32-разрядный C/C++ оптимизирующий компилятор версии 14.00.50727.762 для 80x86

Copyright (C) корпорации Microsoft. Все права защищены.

vec.cc vec.cc (16): ошибка C2059: ошибка синтаксиса: '{' vec.cc (16): ошибка C2143: ошибка синтаксиса: отсутствует ';' before '{' vec.cc (16): ошибка C2143: синтаксическая ошибка: отсутствует ';' before '}' vec.cc (19): ошибка C2059: ошибка синтаксиса : '{' vec.cc (19): ошибка C2143: синтаксис ошибка: отсутствует ';' before '{' vec.cc (19): ошибка C2143: ошибка синтаксиса : missing ';' до '}'

+0

Поддержка Windows G ++ * ужасна *. (А именно потому, что компилятор * еще * не имеет надлежащей поддержки Unicode! :() Кроме того, это не отвечает на вопрос OP. –

+0

Я использую g ++ в комплекте с Qt 4.6 для Windows, и кажется, что коды Qt скомпилируются просто отлично, используя g ++ под окнами. –

+0

Большинство приложений Qt на окнах не поддерживают Unicode. QED –

1

Я считаю, что это языковое расширение, поддерживаемое GCC, которое, вероятно, недоступно в MSVC.Вы можете искать «выражение конструктора» в своих документах, но единственным решением может быть получение GCC для окон. См:

Constructor Expressions