在 C++ 中,extern "C" 和直接使用 C 语言之间的主要区别在于编译和链接过程中的名称修饰(name mangling)和函数调用约定。让我们深入了解这两者的区别:
1. 名称修饰(Name Mangling)
C++ 中的名称修饰
C++ 语言支持函数重载,即允许在同一作用域内定义多个名称相同但参数不同的函数。为了支持这一特性,C++ 编译器会对函数名称进行修饰(name mangling),将函数名称、参数类型和其他信息编码在符号名称中。这使得编译器能够区分不同的函数定义。
示例:
cpp
// C++ 代码
void foo(int);
void foo(double);
在编译时,foo(int) 和 foo(double) 可能被转换成如下不同的符号名称:
foo_int (具体形式取决于编译器)
foo_double
C 中的名称修饰
C 语言不支持函数重载,因此它不会对函数名称进行修饰。在 C 中,函数名称是原始的,不会被改变。
示例:
c
// C 代码
void foo(int);
void foo(double); // 错误:C 语言不支持函数重载
|