2012-05-20 54 views
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"); 
} 

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

+0

'void teste();'...'test();'。我不这么认为。 –

回答

4

此:

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

等效于此:

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

static StaticStruct TheStaticSupport; 

它定义了一个名为StaticStruct类型和的一个实例键入名为TheStaticSupport的内部链接(尽管由于它是在未命名的名称空间中声明的,因此static是冗余的)。

TheStaticSupport的构造函数在输入main()之前调用来构造对象。这称为test()函数。

1

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

注意,你不需要声明StaticStruct类型的一个全局对象,并构造(运行main()调用之前)调用test()

+1

从技术上讲,未命名名称空间中的实体可能具有外部链接。 –