我偶然发现了一些看起来像这样的C ++ 11代码:
// some_file.h
namespace blah {
class X {
public:
constexpr const static std::initializer_list<uint64> SOME_LIST =
{1,2,3};
};
}
// some_file.cpp
#include "some_file.h"
namespace blah {
constexpr const std::initializer_list<uint64> X::SOME_LIST;
}
编译好。我假设cpp文件中的定义用于避免包含标题的每个文件中的符号重复(如果我错了,请纠正我。)
然后我尝试了以下内容:
// my_file.h
namespace bleh {
constexpr const static char SOME_CONSTANT[] = "yay";
}
// my_file.cpp
#include "my_file.h"
namespace bleh {
// if I add this or any other variation, compilation breaks!
//constexpr const static char SOME_CONSTANT[];
}
如果我在.cpp文件中添加显式定义,则上述代码不起作用。所以我想知道:在第二种情况下是否存在符号重复?如果是这样,有没有办法在没有封闭类的情况下定义变量?
答案 0 :(得分:2)
static
个关键字在这里意味着两件不同的事情:
在文件范围(全局和/或命名空间范围)声明变量或函数时,static关键字指定变量或函数具有内部链接。声明变量时,变量具有静态持续时间,编译器将其初始化为0,除非您指定另一个值。
在类声明中声明数据成员时,static关键字指定该类的所有实例共享该成员的一个副本。必须在文件范围定义静态数据成员。您声明为const static的整数数据成员可以具有初始化程序。
C ++需要您在某处定义静态类成员,因为类符号是全局的(您的成员也是如此)。由于多种定义,这不能在标题中完成。
在第二种情况下,每个编译单元都使用自己的变量,并且没有全局符号。