5

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

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

然后保证以严格的顺序定义(A 然后 B 然后 C)。但是如果我改用 const 会发生什么?

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

如果那在功能范围内 - 没关系。但是全局范围呢?据我所知,不能保证全局变量的定义顺序。那么常量呢?

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

(我也很好奇 C 和 C++ 在这个特定问题上是否有任何区别)。

UPD:问题应该是这样的:在这件事上,C 和 C++ 之间有什么区别(如果有的话)?

4

4 回答 4

6

根据标准中的§3.6.2/2:

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

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

于 2013-11-11T11:05:07.923 回答
3

只要您的 3 行在同一个源文件中,您的代码就会运行良好。(在 C++ 中)。在 C 中你会得到一个错误。

于 2013-11-11T10:54:03.723 回答
2

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

error: initializer element is not constant
于 2013-11-11T10:53:51.563 回答
0

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

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

C++因此,如果 3 行按该顺序排列,您的代码将起作用。在C中,编译器会抛出一个错误,因为const不能使用变量来初始化 a !!!

于 2013-11-11T12:44:18.780 回答