在Lischner's C++ in a Nutshell 2002
中每个函数,函数类型和对象都有一个语言链接,它被指定为一个简单的字符串。默认情况下 联系是" C ++"。唯一的其他标准语言链接是" C"。所有 其他语言链接和与不同相关的属性 语言联系是实现定义的。
语言链接只属于一个函数,而不属于非函数对象吗?我见过的例子似乎是肯定的。但我想我想念一些东西。
每个'函数类型的引用含义是什么?和'对象'有语言联系?
感谢。
答案 0 :(得分:0)
不,变量也可以有语言联系。
首先,你的书解释了标准:
所有函数类型,具有外部链接的函数名称,带有外部链接的和变量名称都具有语言链接。
仅此一点就表明您可以将链接规范应用于变量。
下面是这个例子:
extern "C" int i; // declaration
extern "C" {
int i; // definition
}
其中显示了如何将链接说明符应用于非函数。此外,通过标准的整个 [dcl.link] 章节,可以多次提及函数和变量。
答案 1 :(得分:0)
语言链接规范旨在实现链接到源自不同源语言的相同程序对象文件。
问题在于,通常,目标文件中的实体(函数,变量等)的名称与源代码中相应实体的名称不完全匹配。
C,是一种古老而“简单”的语言,并不关心这些考虑因素,并且在目标文件中使用了源名称。
C ++建立在C之上,引入了函数重载,允许不同的函数具有相同的名称。因此,C ++函数的签名必须在表示目标文件中该函数的符号名中进行编码。
此外,C ++实体的名称可能包含以下字符(不能出现在C标识符中):
:
- 使用完全限定名称(std::cout
)<
, >
- 在模板专精的名称中+
, -
, *
, /
和其他特殊符号 - 在重载运算符的名称中可能就是说,旧链接器在符号名称中处理这些字符时会遇到问题,因此C ++编译器必须使用安全子集对这些字符进行编码。
C ++中的非函数实体(即 - 名称空间变量,非模板和模板类的静态数据成员)可以包含字符 :
, {{1}名称中包含, <
。因此,如果我们只考虑C和C ++,变量也必须具有语言链接。但是,如果C ++变量的完全限定名称(不包括前导全局名称空间前缀)不包含提到的字符,则其符号名称与其源名称一致。因此,当指定变量的“C”链接产生影响时,我无法想到这种情况。
原则上,语言链接规范允许从其他编程语言编译的模块中导入名称(但是,如您的引用中所述,这些是实现定义的)。如果您需要链接这样的外语模块并在其中引用“全局”变量,您首先必须使用语言链接规范在源文件中声明它:
>
然而,我不相信你会在实践中遇到类似的事情。