Как сделать конструкцию на месте структуры, приведенной к компиляции массива в Visual C ++ 2008? - PullRequest
0 голосов
/ 12 апреля 2010

Я работаю с довольно большой кодовой базой, которая прекрасно компилируется в Linux, но vc ++ 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 '{'

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

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

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

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

Выражения конструктора

1 голос
/ 12 апреля 2010

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

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

0 голосов
/ 12 апреля 2010

Если вы просто хотите скомпилировать свои коды под 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;
}

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

E: \ tmp> g ++ vec.cc

E: \ tmp> cl vec.cc Microsoft (R) 32-разрядная версия Оптимизирующая версия компилятора C / C ++ 14,00.50727,762 для 80x86

Авторские права (C) Microsoft Corporation. Все права защищены.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...