Visual C ++ 2010 Express C2099使用宏中的常量初始化的结构出错

|| 编译器:Microsoft Visual C ++ 2010 Express,SP1 项目属性:C / C ++高级编译为:作为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选项)。     
已邀请:
您的代码在我的系统上可以很好地编译(MS Visual Studio 2005)。 您可以预处理代码以尝试手动查找问题:   cl your_file.c / E> stuff.c 这将生成一个预处理文件(您可能必须提供更多的命令行选项;您可以从项目的“属性页”中将其复制粘贴)。   cl stuff.c 这应该重现该问题。然后尝试看
stuff.c
中的代码;如果您没有立即发现问题,请尝试对其进行调整(例如,将复杂的内容替换为0)-这应该可以提示问题。 (由于您的系统比我的系统新得多,因此某些细节可能会有所不同,例如,您系统上的编译器可能称为“ 4”以外的名称,但这种想法可能会起作用)     
由于某种原因,Microsoft C编译器无法将“ 5”预处理器宏识别为常量(可能是因为它在行与行之间发生了变化?),因此您不能使用它来初始化结构成员。 生成预处理的.i文件实际上并没有帮助,因为它生成合法的代码,可以在用常数替换ѭ5之后正常编译。显然,C编译器没有尝试编译相同的预处理输出。 您应该可以使用
foo.lino = __LINE__;
以后没有任何问题。这似乎是Microsoft C编译器带来的麻烦。我使用过的其他C编译器似乎对ѭ5的使用没有任何问题。 我唯一能找到的解决方法是将文件编译为C ++代码(/ Tp)。     
当启用“编辑并继续”调试数据库模式时,MSVC编译器不会将“ 5”宏识别为常量。如果您不关心“编辑并继续”,则可以切换到另一种数据库模式,该问题应会消失。     

要回复问题请先登录注册