这段代码实际上是做什么的?
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
void test();
namespace {
static struct StaticStruct {
StaticStruct() {
test();
}
} TheStaticSupport;
}
int main(void) {
return 0;
}
void test() {
printf("testing function\n");
}
为什么测试函数实际被调用?为什么要使用“匿名”命名空间?我在开源项目中找到了这段代码......
答案 0 :(得分:4)
此:
static struct StaticStruct {
StaticStruct() {
test();
}
} TheStaticSupport;
等同于:
struct StaticStruct {
StaticStruct() {
test();
}
};
static StaticStruct TheStaticSupport;
它定义了一个名为StaticStruct
的类型和一个名为TheStaticSupport
的类型的实例,它具有内部链接(但是,因为它在未命名的命名空间中声明,所以static
是多余的)。
在输入TheStaticSupport
之前调用main()
的构造函数来构造对象。这会调用test()
函数。
答案 1 :(得分:1)
匿名命名空间为包含的对象提供内部链接,因为翻译单元以外的任何人都无法知道它们的完全限定名称。这是C中旧static
的复杂人类版本。
请注意,您确实声明了一个StaticStruct
类型的全局对象,并且它的构造函数(在调用main()
之前运行)调用test()
。