1

c++ 03 標準 (7.1.1 ストレージ クラス指定子 [dcl.stc]) を読んでいるときに、次のような例がいくつかありますが、連続する各宣言のリンケージがどのように決定されるかわかりません。誰でもここで助けてもらえますか? 前もって感謝します!

static char* f();    // f() has internal linkage
char* f() 
       { /* ... */ } // f() still has internal linkage

char* g();           // g() has external linkage
static char* g() 
       { /* ... */ } // error: inconsistent linkage

void h();
inline void h(); // external linkage

inline void l();
void l(); // external linkage

inline void m();
extern void m(); // external linkage

static void n();
inline void n(); // internal linkage

static int a; // a has internal linkage
int a; // error: two definitions

static int b; // b has internal linkage
extern int b; // b still has internal linkage

int c; // c has external linkage
static int c; // error: inconsistent linkage

extern int d; // d has external linkage
static int d; // error: inconsistent linkage

UPD:さらに、標準のステートメントをどのように理解できますか?

特定の実体に対する連続した宣言によって暗示される関連性は、一致するものとします。つまり、特定のスコープ内で、同じオブジェクト名または関数名の同じオーバーロードを宣言する各宣言は、同じリンケージを意味するものとします。ただし、オーバーロードされた関数の特定のセット内の各関数は、異なるリンケージを持つことができます。

4

1 に答える 1

3

staticグローバルスコープで宣言された独立した関数または変数で使用しない限り、それらには外部リンケージがあります。

関数でキーワードを使用してもinline、関数のリンケージは変更されないことに注意してください。

注意すべきもう 1 つの重要な点はconst、C とは異なり、C++ では変数に内部リンケージがあることです。


特定の実体に対する連続した宣言によって暗示される関連性は、一致するものとします。つまり、特定のスコープ内で、同じオブジェクト名または関数名の同じオーバーロードを宣言する各宣言は、同じリンケージを意味するものとします。ただし、オーバーロードされた関数の特定のセット内の各関数は、異なるリンケージを持つことができます。」

宣言はコンパイラに識別子を導入し、コンパイラがその型を認識できるようにします。C++ では、識別子は必要な回数だけ宣言できます。次に例を示します。

void doSomething(int, double);         // External Linkage
extern void doSomething(int, double);  // External Linkage is explicitly mentioned 

引用された一節は、同じ識別子に対するそのようなすべての宣言が同じリンケージを指定する必要があることを意味します。たとえば、次は無効です。

void doSomething(int, double);        //External Linkage
static void doSomething(int, double); //Internal Linkage due to static

一方、同じ関数のオーバーロードされたバージョンは異なるリンケージを持つ可能性があるため、次のことが有効です。

void doSomething(int, double);
extern void doSomething(int, double);
void doSomething(double,int);
于 2012-09-04T03:33:33.427 に答える