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

标签 c macros compiler-errors structure visual-c++-2010-express

编译器:Microsoft Visual C++ 2010 Express,SP1 项目属性:C/C++ Advance 编译为:编译为 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) - 这应该会提示问题。

(由于您的系统比我的系统新得多,因此某些细节可能会有所不同,例如,您系统上的编译器可能被称为 cl 以外的名称,但这个想法可能会起作用)

关于c - Visual C++ 2010 Express C2099 使用宏中的常量初始化的结构错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5312913/

相关文章:

loops - 使用 lisp 循环宏进行高级循环

c - sscanf - 读取十六进制值不适用于逗号

python - 从 SPSS 中的所有变量名称中去除前缀

java - openJDK 版本号 - 这些是宏吗? : $MAJOR. $次要.$安全。如何访问这些内容?

c++ - 写入文件权限被拒绝

c - 未声明的变量和预期的标识符错误

c - C 中的 strtok 错误

更改c指针值的正确方法

c - 将数组文字作为宏参数传递

compiler-errors - 如何使用 Ord::max 函数?