我最近在一个头文件中看到了这段代码,很惊讶它的工作原理:
namespace NS {
static int uid = 0;
class X {
public:
static int getUID() { return uid++; }
};
}
如果从几个不同的 C++ 源文件调用静态方法NS::X::getUID()
,我惊讶地发现它正确生成了唯一 ID(跨翻译单元唯一)。我认为命名空间范围内的静态变量与翻译单元有内部链接。这里发生了什么?类 X 中的内联静态方法是否有它自己的翻译单元,这就是它生成唯一 ID 的原因?还是由于我的编译器中的怪癖而对我有用?
上面的代码是否依赖于“安全”的定义良好的行为?如果是这样,这是一种在内联或模板类中生成唯一 ID 的出奇简洁的方法,即使它看起来有点笨拙。还是像这样为静态唯一 ID 函数生成一个新的 C++ 源文件,并将静态 ID 移动到类中更好?
更新:
对于一个测试用例,我在不同的文件(file1.cpp、file2.cpp 等)中编写了几个这样的函数:
#include "static_def.h" // Name of the above header file.
void func1() {
int uid1 = NS::X::getUID();
int uid2 = NS::X::getUID();
std::cout << "File1, UID1: " << uid1 << ", UID2: " << uid2 << std::endl;
}
令人惊讶的输出(在从 main 调用这些之后)是:
File1, UID1: 0, UID2: 1
File2, UID1: 2, UID2: 3