考虑在标题中定义的类成员函数的情况,其中包含static
存储变量。当您在多个编译单元中包含标头时,最终会得到static
变量的多个副本。但是,the compiler will fix this for you,只需选择一个发出的变量(请注意,这与内联不同)。这是通过对符号的可能类型的GNU特定扩展来实现的,正好gnu_unique_object
(它们显示为" u"在nm
中,它们在手册页中调用它们& #34;唯一的全局符号")。
问题是,如何强制编译器为任意变量生成这种符号?我厌倦了在课堂上包装东西以获得这种行为。
答案 0 :(得分:0)
如果在头文件中声明全局变量,那么您将在每个编译单元中获得该变量的不同实例。 extern
关键字就是你所追求的。此关键字使实例化成为前向声明。它可以被认为是一个承诺,即该名称的变量在不同的编译单元中实例化,并且在链接时可以找到。
MyTrueGlobals.h
extern int global_variable_1;
MyTrueGlobals.cpp
int global_variable_1 = 0;
答案 1 :(得分:0)
从 C++ 17 开始,可以使用内联变量。它们产生 gnu_unique_object
符号:
$ cat c1.cpp
inline int var1 = 123;
void f1() {
int x = var1;
}
$ g++ -std=c++1z -c c1.cpp
$ nm -C c1.o
0000000000000000 T f1()
0000000000000000 u var1