全局const定义的顺序

时间:2013-11-11 10:50:06

标签: c++ c

我想这个问题已经被问过,但我找不到了。 如果我使用宏而不是像这样的常量:

 #define A 0
 #define B (A+1)
 #define C (B+A)

然后保证按严格顺序定义(A然后是B然后是C)。 但是如果我使用consts会发生什么呢?

 const int A = 0;
 const int B = A + 1;
 const int C = A + B;

如果那是在功能范围内 - 那很好。但全球范围呢?据我所知,无法保证全局变量的定义顺序。那些有争议的呢?

我认为这是阻止我使用consts而不是宏的最后一件事。

(我也很好奇C和C ++在这个特殊问题上是否存在任何差异)。

UPD:问题应该是这样的:在这个问题上C和C ++之间有什么不同(如果有的话)?

4 个答案:

答案 0 :(得分:6)

标准中的§3.6.2/ 2:

  

在单个翻译单元中定义的有序初始化变量应按照翻译单元中的定义顺序进行初始化。

因此,您的代码格式正确,并且在任何标准C ++编译器中都有一个结果。

答案 1 :(得分:3)

只要您的3行位于同一源文件中,您的代码就能正常运行。 (用C ++编写)在C中你会得到一个错误。

答案 2 :(得分:2)

在全局范围内以这种方式定义和初始化可确保导致编译时错误(在C中):

error: initializer element is not constant

答案 3 :(得分:0)

C这是一个错误,这是因为const变量是由c编译器分配的内存。

C++编译器中可以自由地在代码中嵌入const变量。因此C ++不会抛出任何错误。 const变量仅在您使用(&)运算符的地址时才分配内存。

因此,如果3行按顺序排列,则代码将在C++中运行。 在C中,编译器会抛出一个错误,因为使用变量无法完成const的初始化!!!

相关问题