2012-05-20 55 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

從技術上講,未命名名稱空間中的實體可能具有外部鏈接。 –