2012-09-04 102 views
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:此外,我怎麼能理解標準的聲明,

通過連續的聲明給定實體應同意暗示的聯繫。也就是說,在一個給定的範圍內,每個聲明相同的對象名稱或者相同的函數名稱重載應該意味着相同的連接。但是,給定的一組重載函數中的每個函數都可以有不同的鏈接。

+0

等待,那些你要問哪個?請提出具體問題。 –

+2

我列出的所有人。謝謝。 –

回答

3

除非你在全局範圍內聲明的獨立函數和變量使用static他們將有外部鏈接

請注意,對函數使用關鍵字inline不會更改函數的鏈接。

另一個需要注意的重要一點是const變量有內部鏈接的C++不像C.


通過連續的聲明給定實體應同意暗示的聯繫。也就是說,在一個給定的範圍內,每個聲明相同的對象名稱或者相同的函數名稱重載應該意味着相同的連接。在一組給定的重載函數的每個功能可以具有不同的連接,但是。」

的聲明引入一個標識符給編譯器,以便編譯器可以知道它的type.In 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);