语言链接只属于一个函数吗?

时间:2016-06-21 15:10:41

标签: c++ linkage

Lischner's C++ in a Nutshell 2002

  

每个函数,函数类型和对象都有一个语言链接,它被指定为一个简单的字符串。默认情况下   联系是" C ++"。唯一的其他标准语言链接是" C"。所有   其他语言链接和与不同相关的属性   语言联系是实现定义的。

语言链接只属于一个函数,而不属于非函数对象吗?我见过的例子似乎是肯定的。但我想我想念一些东西。

每个'函数类型的引用含义是什么?和'对象'有语言联系?

感谢。

2 个答案:

答案 0 :(得分:0)

不,变量也可以有语言联系。

首先,你的书解释了标准:

  

所有函数类型,具有外部链接的函数名称,带有外部链接的和变量名称都具有语言链接。

仅此一点就表明您可以将链接规范应用于变量。

下面是这个例子:

extern "C" int i; // declaration
extern "C" {
    int i; // definition
}

其中显示了如何将链接说明符应用于非函数。此外,通过标准的整个 [dcl.link] 章节,可以多次提及函数变量

答案 1 :(得分:0)

语言链接规范旨在实现链接到源自不同源语言的相同程序对象文件。

问题在于,通常,目标文件中的实体(函数,变量等)的名称与源代码中相应实体的名称不完全匹配。

C,是一种古老而“简单”的语言,并不关心这些考虑因素,并且在目标文件中使用了源名称。

C ++建立在C之上,引入了函数重载,允许不同的函数具有相同的名称。因此,C ++函数的签名必须在表示目标文件中该函数的符号名中进行编码。

此外,C ++实体的名称可能包含以下字符(不能出现在C标识符中):

  1. : - 使用完全限定名称(std::cout
  2. < > - 在模板专精的名称中
  3. + - * / 和其他特殊符号 - 在重载运算符的名称中
  4. 可能就是说,旧链接器在符号名称中处理这些字符时会遇到问题,因此C ++编译器必须使用安全子集对这些字符进行编码。

    C ++中的非函数实体(即 - 名称空间变量,非模板和模板类的静态数据成员)可以包含字符 : {{1}名称中包含 < 。因此,如果我们只考虑C和C ++,变量也必须具有语言链接。但是,如果C ++变量的完全限定名称(不包括前导全局名称空间前缀)不包含提到的字符,则其符号名称与其源名称一致。因此,当指定变量的“C”链接产生影响时,我无法想到这种情况。

    原则上,语言链接规范允许从其他编程语言编译的模块中导入名称(但是,如您的引用中所述,这些是实现定义的)。如果您需要链接这样的外语模块并在其中引用“全局”变量,您首先必须使用语言链接规范在源文件中声明它:

    >

    然而,我不相信你会在实践中遇到类似的事情。