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:
- 外部链接 - 变量或函数在别处定义
- 语言链接 - 变量或函数以"external"语言
定义
- 显式模板实例化声明
在您的情况下,您使用的是 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);
我很好奇链接过程中会发生什么,而且,在我研究这方面的过程中,我发现了这段代码
#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:
- 外部链接 - 变量或函数在别处定义
- 语言链接 - 变量或函数以"external"语言 定义
- 显式模板实例化声明
在您的情况下,您使用的是 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);