2012-09-04 38 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);