Visual C ++ 2010 Express C2099 Ошибка для структур, инициализированных с помощью констант в макросе - PullRequest
0 голосов
/ 15 марта 2011

Компилятор: Microsoft Visual C ++ 2010 Express, SP1 Свойство проекта: C / C ++ Advance Compile As: Компилировать как код C (/ TC)

Сообщение:

error C2099: initializer is not a constant

Простой тестовый примерОтображение ошибки:

typedef struct
{
    char *stringP;
    int  lino;
} foo_t;


#define bad {static foo_t foo ={__FILE__,__LINE__};}
#define good {static foo_t foo ={"filename",10};}

int main()
{

    bad;        // error C2099: initializer is not a constant
    good;       // no error

    return 0;
}

Это приводит к ошибке C2099.Этот код правильно компилируется и ссылается в gcc, но не в Visual C ++ 2010 Express (компилируется как код C, т.е. опция / TC).

Ответы [ 3 ]

0 голосов
/ 21 мая 2011

По какой-то причине компилятор Microsoft C не распознает макрос препроцессора __LINE__ как константу (предположительно, потому что он изменяется от строки к строке?), Поэтому вы не можете использовать его для инициализации элемента структуры.

Создание предварительно обработанного файла .i на самом деле не помогает, поскольку он генерирует юридический код, который прекрасно компилируется после замены __LINE__ на константу.По-видимому, компилятор C не пытается скомпилировать этот же предварительно обработанный вывод.

Вы сможете использовать

foo.lino = __LINE__;

позже без каких-либо проблем.Похоже, это жалобы компилятора Microsoft C.Другие компиляторы C, которые я использовал, похоже, не имеют проблем с этим использованием __LINE__.

Единственный обходной путь, который мне удалось найти, - это скомпилировать файл в виде кода C ++ (/ Tp).

0 голосов
/ 26 июля 2012

__LINE__ макрос не распознается компилятором MSVC как постоянный, если включен режим отладочной базы данных «Редактировать и продолжить». Если вас не волнует «Редактировать и продолжить», вы можете переключиться в другой режим базы данных, и проблема должна исчезнуть.

0 голосов
/ 16 марта 2011

Ваш код хорошо компилируется в моей системе (MS Visual Studio 2005).

Вы можете предварительно обработать свой код, чтобы попытаться найти проблему вручную:

cl your_file.c / E> stuff.c

Это создает предварительно обработанный файл (вам, вероятно, придется предоставить намного больше параметров командной строки; вы можете скопировать и вставить их со страниц свойств проекта).

cl stuff.c

Это должно воспроизвести проблему.Затем попробуйте посмотреть код в stuff.c;если вы не видите проблему сразу, попробуйте ее настроить (например, заменив сложные вещи на 0) - это должно подсказывать проблему.

(Поскольку ваша система намного новее моей, некоторые детали могут отличатьсяНапример, возможно, компилятор в вашей системе называется чем-то отличным от cl, но идея, вероятно, будет работать)

...