#ifdef __cplusplus extern “C“ #endif的作用

  1. #ifdef __cplusplus

这是一个预处理指令,__cplusplus 是 C++ 编译器预定义的一个宏。当代码使用 C++ 编译器进行编译时,这个宏会被定义;而使用 C 编译器编译时,这个宏是未定义的。所以 #ifdef __cplusplus 的作用是判断当前是否处于 C++ 编译环境。

  1. extern "C"

这是 C++ 特有的语法,用于告诉 C++ 编译器以 C 语言的方式来处理指定的代码。在 C++ 中,为了实现函数重载等特性,编译器会对函数名进行修饰(Name Mangling),使得函数名在编译后与源代码中的函数名不同。而 C 语言没有函数重载,不会对函数名进行修饰。当 C++ 代码需要调用 C 语言编写的库或者函数时,就需要使用 extern "C" 来确保 C++ 编译器不会对这些 C 函数名进行修饰,从而保证链接时能够正确找到对应的函数实现。

  1. #endif

用于结束 #ifdef 开始的条件编译块。

cpp 复制代码
// example.h
#ifndef __EXAMPLE_H
#define __EXAMPLE_H

#ifdef __cplusplus  //检测当前是否为C++编译器
extern "C" { //C++专属语法:声明内部函数使用C语言链接规则
             //告诉C++编译器,以下代码按照C语言方式编译,
             //告诉C++编译器:内部函数使用C语言的链接方式
             //解决C++函数重载特性导致的符号链接问题
             //保证C++代码能正确调用C语言实现的函数
#endif
	
// 这里放置函数声明
	void one_c_function(int a);
	int another_c_function(const  char* str);
	
#ifdef __cplusplus
} // 结束extern "C"作用域
#endif

#endif // EXAMPLE_H
cpp 复制代码
// example.c
#include "example.h"
#include <stdio.h>

void one_c_function(int a) {
	// 函数实现...
	printf("my_c_function result a:%d\n",a);
}

int another_c_function(const  char* str) {
	// 函数实现...
    if(!str) return -1;
	printf("another_c_function str is %s",str);
	return strlen(str);
}
cpp 复制代码
// main.c
//#define EXAMPLE_H
#include "example.h"

int main() {
	my_c_function(42);
	another_c_function("Hello World");
	return 0;
}

核心作用原理

  • 名称修饰问题

    C++支持函数重载,编译器会对函数名进行修饰(如my_func可能变成_Z6my_funci),而C语言没有重载,函数名保持原样。这会导致链接阶段找不到C函数。

  • extern "C"的作用

    告诉C++编译器:内部函数使用C语言的链接方式,禁止名称修饰,确保:

    • C++代码能直接调用C函数
    • 二进制兼容C语言库
cpp 复制代码
#ifdef __cplusplus   // 检测1:C++编译器检查
extern "C" {         // 开启C链接规则的作用域
#endif

// 函数声明区域

#ifdef __cplusplus   // 检测2:再次检查C++编译器
}                   // 关闭extern "C"作用域
#endif
相关推荐
我要成为嵌入式大佬15 分钟前
正点原子MP157--问题详解--五(beep编写报错端口繁忙)
stm32·嵌入式硬件·学习
范纹杉想快点毕业17 分钟前
Zynq开发视角下的C语言能力分级详解
c语言·开发语言
振浩微433射频芯片29 分钟前
433MHz在智能家居中的应用大全(一):智能窗帘篇——为什么稳定比花哨更重要?
网络·单片机·嵌入式硬件·物联网·智能家居
鸟电波39 分钟前
硬件笔记——Allegro绘制器件封装和过孔
笔记·嵌入式硬件·智能硬件
Jason_zhao_MR41 分钟前
机器人主控方案米尔RK3576 + ROS2,NPU加速实现目标跟随与机械臂抓取
人工智能·嵌入式硬件·机器人·嵌入式
橘子编程1 小时前
GoF 23 种设计模式完整知识总结与使用教程
java·c语言·开发语言·python·设计模式
意疏1 小时前
【C语言】解决VScode中文乱码问题
c语言·开发语言·vscode
xyx-3v1 小时前
RS485 RE、DE
单片机·嵌入式硬件
Shadow(⊙o⊙)1 小时前
C语言学习中需要的额外函数
c语言·开发语言·学习
艾莉丝努力练剑1 小时前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习