首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >语言链接是否只属于一个函数?

语言链接是否只属于一个函数?
EN

Stack Overflow用户
提问于 2016-06-21 15:10:41
回答 2查看 232关注 0票数 0

2002年李什纳的C++

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

语言链接是否只属于一个函数,而不是一个非函数对象?我看到的例子似乎是肯定的。但我想我错过了什么。

这句话是什么意思,每个“函数类型”和“对象”都有语言链接?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-06-21 15:26:57

不,变量也可以有语言链接。

首先,你的书套用了标准:

所有函数类型、带有外部链接的函数名、带有外部链接的和变量名都有一个语言链接。

这本身就意味着您可以将链接规范应用于变量。

下面是一个例子:

代码语言:javascript
运行
复制
extern "C" int i; // declaration
extern "C" {
    int i; // definition
}

这说明了如何将链接说明符应用于非函数。此外,在标准的整个、dcl.link、一章中,都多次提到函数和变量。

票数 0
EN

Stack Overflow用户

发布于 2016-06-21 18:56:09

语言链接规范的目的是允许链接到来自不同源语言的同一个程序对象文件。

问题是,一般来说,对象文件中的实体名称(函数、变量等)与源代码中相应实体的名称不完全匹配。

C语言是一种古老而“简单”的语言,它不关心这些问题,而是在对象文件中使用源代码。

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

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

  1. : -在完全限定名(std::cout)
  2. <> -在模板专门化的名称中
  3. +-*/和其他特殊符号.在重载运算符的名称中

也许,旧链接器在处理符号名称中的这些字符时会遇到困难,因此C++编译器必须使用安全子集对这些字符进行编码。

非函数实体(即-名称空间变量、非模板和模板类的静态数据成员)可以在其名称中包含:<,和>字符。因此,如果只考虑C和C++,变量也必须有语言链接。但是,如果一个C++变量的完全限定名(不包括前面的全局命名空间前缀)不包含上述字符,那么它的符号名与它的源名重合。因此,当为变量指定"C“链接时,我想不出有什么不同。

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

代码语言:javascript
运行
复制
extern "Sci++" {
    MemAllocFuncPtr Solver##Config##Malloc;

    // Won't the '#' chararcters in the identifier name confuse the C++ compiler?
    // Maybe C++ will need to be enhanced as below:
    using SciPPSolverConfigMalloc = Solver##Config##Malloc;
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37948209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档