1

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

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

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

4

2 回答 2

4

这个:

static struct StaticStruct {
    StaticStruct() { 
        test(); 
    }
} TheStaticSupport;

相当于这个:

struct StaticStruct {
    StaticStruct() { 
        test(); 
    }
};

static StaticStruct TheStaticSupport;

它定义了一个名为的类型StaticStruct和一个以内部链接命名的类型的实例TheStaticSupport(不过,由于它是在未命名的命名空间中声明的,因此static是多余的)。

TheStaticSupport在进入之前调用for的构造函数main()来构造对象。这调用了test()函数。

于 2012-05-20T00:17:25.173 回答
1

匿名命名空间为包含的对象提供了内部链接,因为它们的完全限定名称永远不会被翻译单元之外的任何人知道。这是 C 语言中老练的男人的版本static

请注意,您确实声明了一个类型为 的全局对象StaticStruct,并且它的构造函数(在调用之前运行main())调用了test()

于 2012-05-20T00:21:17.777 回答