2

我很好奇链接过程中会发生什么,而且,在我在这个领域的研究中,我已经刺穿了这段代码

#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两次可以吗?

4

1 回答 1

4

c++ 语言对添加新关键字很敏感,因此有些关键字会被重用以表示不同的东西。extern是这些重复使用的关键字之一。它有3 种可能的含义

  1. 外部链接 - 变量或函数在其他地方定义
  2. 语言链接 - 变量或函数以“外部”语言定义
  3. 显式模板实例化声明

在您的情况下,您使用的是 1 和 2。extern "C"声明代码具有"C"而不是默认"C++"链接。这也意味着外部链接,因此在纯 C++ 代码中您可以编写:

extern "C" {
    double reciprocal (int i);
}

并且reciprocal会被自动标记extern。添加额外extern内容没有效果,并且对于没有extern "C"包装器的 C 版本是必需的。

请注意,如果您使用的是单个声明版本,extern "C"则使用第二个extern是无效的:

extern "C" extern double reciprocal (int i);

由于第二个extern不是必需的,因此正确的声明是:

extern "C" double reciprocal (int i);
于 2020-04-27T20:05:19.777 回答