【发布时间】:2020-08-11 12:03:08
【问题描述】:
我很好奇在链接过程中会发生什么,并且在我研究这个领域的过程中,我发现了这段代码
#ifdef __cplusplus
extern “C” {
#endif
extern double reciprocal (int i);
#ifdef __cplusplus
}
#endif
代码在某个头文件中,该头文件被一个程序的 .c 和 .cpp 源文件包含。它是一个函数的声明,然后在 .cpp 文件中定义。为什么它起作用?我的意思是,在 .cpp 文件的编译过程中,这将变成
extern "C" {
extern double reciprocal (int i);
}
外部 extern 既使函数在全局范围内可见,又将 C++ 风格的函数名转换为 C 风格。但也有内在的外在。函数externed两次可以吗?
【问题讨论】:
-
忽略预处理
#ifdefs,只看第二个sn-p,前者是语言链接,在你写的时候,主要的意图 将其中的一些实体(函数类型,以及具有外部链接和变量的函数名称和变量)与 C 语言链接,具有这些实体不会具有的一个主要效果错位的名称,而且将被放置在全局命名空间中(因为在 C ABI 中没有命名空间)。 ... -
... 内部
extern不是语言链接说明符而是存储类说明符,不会影响两者的协同,因为reciprocal已经有外部链接即使没有extern(这反过来意味着它具有语言链接,使其可能链接翻译单元来自其他语言)。