打印
[电机应用]

深入了解 C++ 和直接使用 C 语言之间的主要区别

[复制链接]
1058|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
尽快回复过|  楼主 | 2024-7-25 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 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 语言不支持函数重载

使用特权

评论回复
沙发
尽快回复过|  楼主 | 2024-7-25 16:32 | 只看该作者
extern "C" 的作用
extern "C" 是 C++ 中的一个特殊声明,用于指示编译器以 C 语言的方式来处理被修饰的函数或变量。这会禁用 C++ 的名称修饰,使得函数名在编译后保持与 C 语言中相同的形式。

示例:

cpp

// C++ 代码
extern "C" {
    void foo(int);
    void bar(double);
}
在这个例子中:

foo(int) 和 bar(double) 将被编译成与 C 语言相同的符号名称,不会进行 C++ 的名称修饰。
3. 与直接使用 C 语言的比较
直接使用 C 语言
函数名称:函数名保持不变。
链接:C 编译器生成的符号名称不会进行任何修饰,可以直接用于链接和调用。
使用 extern "C"
函数名称:通过 extern "C" 声明的函数名称不会被 C++ 编译器进行名称修饰,从而确保与 C 语言编写的代码可以进行链接。
用途:常用于 C++ 代码与 C 语言代码进行互操作,特别是在 C++ 程序中调用 C 库函数,或者 C++ 代码需要被 C 语言程序调用时。
例子:

C 代码文件(example.c):

c

// example.c
#include <stdio.h>

void foo(int x) {
    printf("Value: %d\n", x);
}
C++ 代码文件(example.cpp):

cpp

// example.cpp
extern "C" {
    void foo(int x);
}

int main() {
    foo(42);  // 调用 C 语言定义的 foo 函数
    return 0;
}
链接命令:

使用 C 和 C++ 编译器编译并链接时,extern "C" 确保 example.cpp 可以找到并链接 example.c 中的 foo 函数。

使用特权

评论回复
板凳
尽快回复过|  楼主 | 2024-7-25 16:32 | 只看该作者
总结
直接使用 C 语言:函数名不变,符号名称没有修饰。
使用 extern "C":在 C++ 中声明的函数名称也不会进行 C++ 的名称修饰,确保与 C 语言编写的函数符号匹配,方便 C 和 C++ 代码之间的互操作。
extern "C" 是实现 C++ 和 C 语言代码互操作的关键工具,确保不同语言的代码能够正确链接和调用。

使用特权

评论回复
地板
尽快回复过|  楼主 | 2024-7-25 16:32 | 只看该作者
C++ 名称修饰:C++ 对函数名称进行修饰,以支持函数重载。这意味着同一名称的不同函数(根据参数类型不同)会有不同的符号名称。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

512

帖子

0

粉丝