以下功能的链接是什么

What are the linkage of the following functions?

本文关键字:链接 是什么 功能      更新时间:2023-10-16

当我阅读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:此外,我如何理解标准中的声明

一个实体的连续声明所暗示的联系应一致。也就是说,在给定的范围内,每一个声明相同的对象名称或函数名称的相同重载都意味着相同的链接。然而,给定的重载函数集中的每个函数都可以有不同的链接。

除非在全局范围内声明的独立函数或变量上使用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);