【发布时间】:2020-01-27 09:30:05
【问题描述】:
首先,让我们看一下标准(C++14 [basic.start.init] 3.6.3/4):
是否在main的第一个语句之前完成对具有静态存储持续时间的非局部变量的动态初始化是由实现定义的。如果初始化延迟到 main 的第一个语句之后的某个时间点,它应该发生在与要初始化的变量在同一翻译单元中定义的任何函数或变量的第一次 odr-use (3.2) 之前。
volatile 说明符意味着可以从外部源修改变量。但是,当无法保证何时初始化时,可能会发生变量被外部修改,然后发生动态初始化的情况。或者当 volatile 关键字存在时,它的工作方式会有所不同吗?
这是我所说的一个例子: 在 myfile.h 中
#ifndef MYFILE_H_
#define MYFILE_H_
int my_init ();
#endif /* MYFILE_H_ */
在 myfile.cpp 中
#include <myfile.h>
#include <iostream>
int my_init () {
std::cout << "init" << std::endl;
return 1;
}
static volatile int my_var __attribute__((unused)) = my_init();
在 main.cpp 中
#include <myfile.h>
#include <iostream>
int main() {
std::cout << "main" << std::endl;
// Let's assume first odr-use of my_var or my_init happens down here, maybe
// in a function from another translation unit.
return 0;
}
想象一下 my_init 是一个将 my_var 设置为有效默认状态的函数,以防万一它不会在外部设置为另一个有效状态。因此,当 my_var 首先在外部修改它,但后来设置为默认状态时,就会出现问题。因此,问题是 my_var 何时初始化。正如上面的标准引用所暗示的那样,还是volatile 改变了游戏规则?
【问题讨论】:
-
一旦
main函数被调用,命名空间范围内的所有变量(包括全局命名空间)都应该已经被初始化了。 -
volatile仅影响允许编译器优化对该变量的访问的方式。似乎不太可能对初始化顺序产生任何影响。 -
@Some 程序员老兄您指的是
static volatile变量还是命名空间范围内的任何变量?在后一种情况下,您的声明不符合标准所说的,即初始化可能被推迟?
标签: c++ static volatile static-initialization