【发布时间】:2017-11-30 08:59:40
【问题描述】:
如果我有以下A.h 文件(仅标题):
#pragma once
struct A{
static inline struct Initializer{
Initializer(){
std::cout << "init A" << std::endl;
}
} initializer;
};
#include "A.h"(来自另一个标头,将包含在 main.cpp 中)是否足以让 Initializer::Initializer() 在 main() 之前被调用?
我读到该标准要求仅在使用之前使用动态初始化来初始化静态变量。
是否动态初始化由实现定义 (8.5, 9.4, 12.1, 12.6.1) 完成命名空间范围的对象 在 main 的第一个语句之前。如果初始化被推迟 在 main 的第一个语句之后的某个时间点,它应该 在第一次使用中定义的任何函数或对象之前发生 与要初始化的对象相同的翻译单元。
#include 是否被视为“使用”?
【问题讨论】:
-
局部静态变量(函数内部)在函数第一次被调用时被初始化。在调用
main之前初始化所有其他静态变量。 -
#include "file"仅表示“在此处插入'文件'的内容”。它的行为与您使用复制和粘贴完全一样(但在报告诊断时调整行号)。 -
@Someprogrammerdude 我不认为这是真的……en.cppreference.com/w/cpp/language/initialization 请参阅“延迟动态初始化”
标签: c++ language-lawyer