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れる前に呼び出されます。main()これにより、関数が呼び出されtest()ます。

于 2012-05-20T00:17:25.173 に答える
1

匿名の名前空間は、含まれているオブジェクトに内部リンクを提供します。これは、完全修飾名が翻訳ユニットの外部の誰にも知られることはないためです。staticそれはCの古いものの洗練された男のバージョンです。

StaticStruct型のグローバルオブジェクトを宣言し、そのコンストラクター(main()が呼び出される前に実行される)がを呼び出すことに注意してくださいtest()

于 2012-05-20T00:21:17.777 に答える