Extern 在 C++ 中使用了两次

Extern used twice in C++

我很好奇链接过程中会发生什么,而且,在我研究这方面的过程中,我发现了这段代码

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

C++ 语言对添加新关键字过敏,所以有些关键字被重复使用以表示不同的东西。 extern 是这些重复使用的关键字之一。它有 3 possible meanings:

  1. 外部链接 - 变量或函数在别处定义
  2. 语言链接 - 变量或函数以"external"语言
  3. 定义
  4. 显式模板实例化声明

在您的情况下,您使用的是 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);