标准(c++)对编译时初始化有什么规定?
What do the standards (C++) say about compile time initialization?
换句话说,什么时候"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
: int
和float
没有构造函数,并且初始化式是一个常量表达式。常量初始化是静态初始化的一部分,和:
静态初始化应该在任何动态初始化之前执行。
标准没有明确规定实现,但是没有静态初始化的顺序,可以理解的是,初始值基本上是在加载时提供的,并且没有代码执行以使这些全局变量具有其初始值。
变量d
不满足这些条件,因为它的初始化项不是常量表达式(因为c
不是常量表达式)。标准允许动态或静态初始化d
回答:'换句话说,'静态const '何时等同于' #define ' ?'
绝不,前者是编程语言的一部分,后者是预处理器文本处理指令。
声明静态const和定义是两回事。由define替换的值可以是非const和非静态的。
#MY_VAR 9
static const int a = MY_VAR;
int b = MY_VAR;
本质上定义了预编译时字符串替换。静态关键字和常量关键字在一起工作是不同的。
相关文章:
- 未初始化的变量有什么危险
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 不同的类或结构初始化方法之间的性能差异是什么?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 静态初始化的反义词是什么?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 初始化类成员的更好做法是什么?
- C++初始化的结果是什么?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 这些初始化之间有什么区别?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 两种初始化有什么区别:Foo f();Foo f = Foo()
- 在多个对象中初始化预定义成员变量的正确方法是什么?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- C 带有什么默认复制构造函数使用什么初始化基本复制构造函数
- 在C++中定义构造器的更好方法是什么?初始化列表或 Ctor 正文中的初始化