extern "C"用于C++中按C语言方式编译函数,避免名字修饰问题。它使C++能调用C函数或被C调用,需在头文件中用__cplusplus宏包裹,仅适用于全局函数和变量,不可用于类成员或重载函数。

在C++中使用 extern "C" 主要是为了实现C++代码与C代码的混合编译,解决C++编译器对函数名进行“名字修饰(name mangling)”的问题。C语言不进行名字修饰,而C++为了支持函数重载会改变函数名,导致链接时找不到C函数。
extern "C" 的作用
extern "C" 告诉C++编译器:这部分函数或变量按照C语言的方式进行编译和链接,即不进行名字修饰,保持原始函数名。
注意: C++支持函数重载,C不支持。因此用 extern "C" 声明的函数不能重载。基本使用方法
常见于头文件中,用于包含C语言编写的函数声明。
1. 单个函数声明:
立即学习“C++免费学习笔记(深入)”;
extern "C" void my_c_function();extern "C" int add(int a, int b);
2. 多个函数批量声明(推荐写法):
extern "C" {void func1();
int func2(int x);
double calculate(double a, double b);
}
在头文件中正确使用 extern "C"
如果你有一个C语言写的库(比如 mylib.h 和 mylib.c),想在C++程序中调用,需要在头文件中做兼容处理。
95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we
示例 mylib.h:
#ifndef MYLIB_H#define MYLIB_H
#ifdef __cplusplus
extern "C" {
#endif
void say_hello();
int add_numbers(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // MYLIB_H
解释:
- __cplusplus 是C++编译器定义的宏。
- 当这个头文件被C++编译器包含时,会加上 extern "C",按C方式链接。
- 当被C编译器包含时,extern "C" 不会被引入(因为C不认识),避免编译错误。
实际调用示例
C语言实现文件 mylib.c:
#include#include "mylib.h"
void say_hello() {
printf("Hello from C!\n");
}
int add_numbers(int a, int b) {
return a + b;
}
C++调用文件 main.cpp:
#include "mylib.h"int main() {
say_hello();
int result = add_numbers(3, 5);
return 0;
}
编译命令(假设用g++):
gcc -c mylib.c -o mylib.og++ main.cpp mylib.o -o program
注意事项
- extern "C" 只能用于全局函数和变量,不能用于类成员函数。
- 不能用 extern "C" 声明重载函数,否则编译报错。
- extern "C" 不改变C++函数的调用约定,只影响名字修饰。
- 如果C++函数要被C代码调用,该函数也必须用 extern "C" 声明,并且使用C兼容的数据类型。










