在Visual Studio中使用const vs #define的问题

据我所知,# #define xyconst int x = y; 应该在Visual Studio编译器下完全相同,但const int x = y; 是首选的方法。

我看到的C代码看起来像这样:

 static const int x = 100000; void SomeFunction(...) { volatile static int y = x; ... } 

这里的问题是y的声明。 如果我使用#define for x,那么没有问题,但使用上面的代码会导致编译器返回“错误c2099:初始化程序不是常量”。

我正在尝试从命令行编译,我没有使用任何编译器标志,所以我不确定是否需要设置一个标志,以便编译器优化const – 或者如果我偶然发现某种特殊情况。

将程序编译为C ++程序也可以,但我宁愿避免这种情况,如果可能的话。

我不知道里面的C标准,但我之前已经读过这个。 这是我的理解。

严格的ANSI C编译器只允许您将常量表达式用作初始化器。 请注意,常量表达式只能涉及文字值,而不是const限定的变量。

我相信这是因为在编译期间,编译器必须计算要初始化的值,以便它可以静态地将此值推送到堆栈,而无需在运行时进行任何计算。 即使是const限定的变量也可以改变(通过删除const限定符并更改值)。

 const int x = 5; *(int *)&x = 3; 

我认为C99只允许在函数范围内使用const限定变量进行初始化,文件范围变量仍受相同限制的约束。

这可以通过另一个保护变量来解决:

 void SomeFunction(...) { static int initialized_y=0; volatile static int y; if(initialized_y==0) y = x; initialized_y=1; ... } 

你也可以把这个成语变成一个宏。