【问题标题】:What are the linkage of the following functions?以下功能的联系是什么?
【发布时间】:2012-09-04 03:30:59
【问题描述】:

当我阅读 c++ 03 标准(7.1.1 Storage class specifiers [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:另外,我如何理解标准中的声明,

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

【问题讨论】:

  • 等等,你在问哪些?请提出具体问题。
  • 我列出的所有内容。谢谢。

标签: c++


【解决方案1】:

除非您在全局范围内声明的独立函数或变量上使用static,否则它们将具有外部链接

请注意,在函数上使用关键字inline 不会更改函数的链接。

另一个需要注意的重点是 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2016-06-07
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多