当我阅读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 :(得分:3)
除非您对在全球范围内声明的独立函数或变量使用static
,否则它们将具有 外部链接 。
请注意,在函数上使用关键字inline
不会更改函数的链接。
需要注意的另一个要点是,{C}中的const
变量具有内部链接,与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);