在 extern "C"
的场景中,它并没有“外部引用”的直接作用,因为其主要功能是指定 C 的链接规范,而不是明确表示定义在外部。换句话说,extern "C"
的作用与普通的 extern
声明不完全相同。
extern "C"
的主要作用
- 主要是告诉编译器按照 C 的规则进行名称链接,避免 C++ 的名称修饰(Name Mangling)。
- 它的作用是针对链接属性,而不是仅仅用于“外部引用”。
例如:
extern "C" void func();
- 编译器会将
func
的链接名处理为 C 风格的符号(如func
),而不会使用 C++ 的修饰符(如_Z4funcv
)。 - 这里的
extern
不再强调“引用外部定义”,而是专注于名称修饰和链接规则。
是否还有外部引用的作用?
1. 默认没有直接外部引用作用
extern "C"
的设计目标是解决 C 和 C++ 的互操作问题,而不是专门用于表示外部定义。
- 如果在声明时仅使用
extern "C"
,它并不隐含“外部定义”的意思。 - 如果需要明确外部引用,还需要结合普通的
extern
场景。
2. 如果与变量一起使用
对于全局变量,extern "C"
可以同时表达“外部定义”的意思。
// C 文件
int var = 42;
// C++ 文件
extern "C" int var;
int main() {
return var; // 可以引用 C 文件中的全局变量 var
}
在这种场景中:
extern
的“外部引用”作用仍然存在。extern "C"
额外确保var
的符号以 C 风格处理。
普通 extern
与 extern "C"
的对比
普通 extern
仅表示“定义在外部”:
extern int globalVar; // 声明外部变量
extern "C"
- 不直接表示“外部引用”,它是为链接规范而设计的。
- 只有当它与变量或未定义的函数一起使用时,才具有隐含的“外部引用”功能:
extern "C" int globalVar; // 既声明外部引用,又指定 C 风格链接 extern "C" void func(); // 声明 C 风格的函数
两者结合
有时需要同时使用普通的 extern
和 extern "C"
,例如:
extern "C" {
extern int globalVar; // 明确外部引用和 C 风格链接
void func();
}
总结
extern "C"
本身并不主要表达“外部引用”,它的核心功能是指定链接规则。- “外部引用”作用仍然适用,但需要结合实际场景,如声明外部变量或未定义的函数时。
- 如果你需要更明确地表达外部定义,建议同时结合普通
extern
的用法。