标准(c++)对编译时初始化有什么规定?

What do the standards (C++) say about compile time initialization?

本文关键字:什么 初始化 c++ 编译 标准      更新时间:2023-10-16

换句话说,什么时候"static const"等价于"#define"?我找了很多,但什么也没找到。这与全局初始化依赖非常相关(我知道,全局是邪恶的,但生活也是邪恶的!)。

我确信标准没有强制,但是它可能提到了。

例如:

static const int a = 2;  // Always seen it as compile time
static const int b = 2 * a;  // Compile time
static const float c = 3.14;  // Compile time
static const float d = c * 1.1 ;  // I know the evils of compile time here, but I've seen it both ways (compile and run time)
static const char e = 'p' ;  // Compile time
static const int *f = NULL;  // Never really tried it :)

这是c++ 11 3.6.2指定的:常量初始化被执行…

如果具有静态或线程存储时间的对象没有被构造函数调用初始化,并且在其初始化项中出现的每个完整表达式都是常量表达式。

这就是您的情况,除了d: intfloat没有构造函数,并且初始化式是一个常量表达式。常量初始化是静态初始化的一部分,和:

静态初始化应该在任何动态初始化之前执行。

标准没有明确规定实现,但是没有静态初始化的顺序,可以理解的是,初始值基本上是在加载时提供的,并且没有代码执行以使这些全局变量具有其初始值。

变量d不满足这些条件,因为它的初始化项不是常量表达式(因为c不是常量表达式)。标准允许动态或静态初始化d

回答:'换句话说,'静态const '何时等同于' #define ' ?'

绝不,前者是编程语言的一部分,后者是预处理器文本处理指令。

声明静态const和定义是两回事。由define替换的值可以是非const和非静态的。

#MY_VAR 9
static const int a = MY_VAR;
int b = MY_VAR;

本质上定义了预编译时字符串替换。静态关键字和常量关键字在一起工作是不同的。