#ifdef __cplusplus 和 extern C 解释

news/2024/10/19 11:30:28

#ifdef __cplusplus 和 extern "C" 是一种常见的预处理宏,用于确保在 C++ 代码中兼容 C 语言的函数或代码接口。让我们逐步解释:

1. #ifdef __cplusplus

  • __cplusplus 是一个在 C++ 编译器中定义的宏,用来表示当前代码是用 C++ 编译器编译的。如果使用 C++ 编译器来编译代码,这个宏会自动被定义。
  • #ifdef 是条件编译指令,意思是“如果 __cplusplus 已定义”,也就是说,这段代码仅在用 C++ 编译器编译时执行。

2. extern "C"

  • 在 C++ 中,函数名支持 函数重载 和 名字修饰(name mangling),这使得函数名在编译后变得复杂。例如,C++ 的名字修饰机制会把函数名编码成带有参数类型信息的字符串。

  • extern "C" 是 C++ 中的一种语言连接规范,表示该函数或代码块应该按照 C 的方式进行编译和链接。C 语言没有名字修饰,因此 extern "C" 告诉 C++ 编译器不要对函数名进行修饰,这样这些函数就可以被其他语言(如 C 或者其他不支持名字修饰的语言)调用。

3. 完整结构解释

#ifdef __cplusplus
extern "C" {
#endif// 这里放的是 C 风格的函数声明或定义
// 它们可以在 C++ 和 C 环境中同时使用#ifdef __cplusplus
}
#endif
  • 当用 C++ 编译器编译时:

    • #ifdef __cplusplus 为真,进入 extern "C" 块。
    • extern "C" 作用在这段代码块上,告诉 C++ 编译器按 C 语言的方式处理这些函数,即不进行名字修饰,使得函数可以在 C 语言或者其他外部代码中被正确调用。
  • 当用 C 编译器编译时:

    • __cplusplus 宏不会被定义,#ifdef __cplusplus 失败,直接忽略 extern "C" 部分。
    • 因为 C 语言本身不支持名字修饰,这样函数在 C 中可以正常编译和调用。

使用场景

这种结构常用于编写跨 C 和 C++ 的库,确保库可以被 C 和 C++ 编译器正确调用。例如,一个用 C 编写的库可以通过 extern "C" 在 C++ 中被正确调用,而不会因为名字修饰问题导致链接错误。

示例:

#ifdef __cplusplus
extern "C" {
#endifvoid my_c_function();  // 函数声明,C 和 C++ 均可以使用#ifdef __cplusplus
}
#endif

这个示例确保 my_c_function 在 C++ 中不被名字修饰,可以被其他 C 代码调用,同时也能在 C++ 项目中正常使用。

总结

  • #ifdef __cplusplus 检查当前代码是否正在使用 C++ 编译器编译。
  • extern "C" 告诉 C++ 编译器按照 C 的方式处理函数,避免名字修饰,使得函数能在 C 和 C++ 之间兼容。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73384.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

10.18 J 组模拟赛*2

上午 “J”组模拟赛 T1:一维围棋 题面 赛时:100 很简单的一道入门题,注意特判int n;char a[105];void init(){cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];int mx = 0;for (int i = 1; i <= n; i++){if (a[i] == .){int lb = 0, rb = 0;for (int j …

AI人员打闹监测识别系统

AI人员打闹监测识别系统通过在校园、工厂和监狱场景部署高清摄像设备,AI人员打闹监测识别系统采集相关视频图像,并通过人工智能视觉算法对图像进行分析和识别。AI人员打闹监测识别系统能够准确判断出是否有人员进行打闹行为,包括学生打闹和工厂或监狱场景中的人员打架斗殴等…

强化学习的数学原理-01基本概念

state:\(The \quad status \quad of \quad agent \quad with \quad respect \quad to \quad the \quad environment\) (agent 相对于环境的状态) 对于下面的网格地图来说:\(state\)就相当于$ location $,用 \(s_1、s_2、...、s_9\)来表示state space:\(The \quad set…

煤矿监管电子封条

煤矿监管电子封条系统通过视频监控和图像分析技术,煤矿监管电子封条能够实时监测矿井各个关键位置的情况。当有人员进出或人数发生变化时,煤矿监管电子封条能够自动识别,并记录下相关信息。同时,煤矿监管电子封条还能够监测设备的开停情况,及时发现异常和故障,以便及时处…

keil 快捷键设置,开发加速的小技巧(个人设置)

点击扳手,选择shortcut key进入快捷键设置页面跳到上一个光标的位置跳到下一个光标的位置跳转到定义(没办法实现组合鼠标按键,F12又太远,不过和QQ的截图热键冲突,需要修改QQ的快捷键,各有取舍吧)跳转到声明

每隔一段时间后第一次请求耗时特别长

同一个接口连续请求耗时都是毫秒级别的,当一段时间不请求后会变成秒级别,通过日志跟踪发现业务出处理的时间是毫秒级别的,怀疑是过滤器或者是容器的问题,通过IDEA 远程debug 发现经过一段时间不使用再次请求接口,会寻找 com.mysql.jdbc.MySQLConnection类,猜测是tomcat 丢…

linux上编译运行c程序

创建test文件,进入该目录后创建hello.c文件使用vim hello.c命令编辑hello.c文件编写完成后保存该文件,使用gcc进行编译并生成可执行程序在终端中执行输入./hello执行相关代码

效率工具类软件分类解析 | To teacher

写给我的同仁的推荐信,万一你需要连你自己也说不清楚的功能软件,你不妨看看这个软件导图,说不定能节省你好多的时间 .前情概要 在编制博客过程中,自己也积累了一些常用的软件,由于主要工作内容集中在前端,所以办公软件使用的不是很多,零零散散,直到看到一位大牛分享在 …