匿名命名空间中的静态结构

时间:2012-05-20 00:14:29

标签: c++ initialization static-initialization

这段代码实际上是做什么的?

#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");
}

为什么测试函数实际被调用?为什么要使用“匿名”命名空间?我在开源项目中找到了这段代码......

2 个答案:

答案 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()