C++调用C函数需用extern “C”解决名称修饰问题:在头文件中用#ifdef __cplusplus extern “C” { #endif包裹声明,或在C++源文件中用extern “C”包含C头文件/定义函数。

在C++中调用C语言函数,核心是解决C++的名称修饰(name mangling)问题。C++编译器会对函数名按参数类型、返回值等信息做编码,而C编译器只保留原始函数名。如果不加处理,链接时会找不到符号。解决方法就是用 extern “C” 告诉C++编译器:“这个函数按C的方式命名和链接”。
在C++代码里声明C函数(最常见场景)
当你有现成的C头文件(比如 math.h 或自定义的 utils.h),又想在C++里用其中的函数,需要把C头文件的声明“包裹”进 extern “C” 块:
直接包含系统C头文件一般不用改(如 #include ),因为标准头通常已内置了 extern “C” 判断但自己写的C头文件,建议在头文件内部加保护性写法,方便C/C++都能安全包含:
// utils.h#ifndef UTILS_H#define UTILS_Hifdef __cplusplus
extern "C" {
endif
int add(int a, int b); // C函数声明void print_message(const char* s);
ifdef __cplusplus
}
立即学习“C语言免费学习笔记(深入)”;
endif
endif
这样C++源文件只需 #include “utils.h” 就能直接调用 add() 和 print_message(),无需额外修饰。
在C++中定义供C调用的函数
如果你在C++源文件里写了一个函数,希望让C代码也能调用它,必须用 extern “C” 修饰函数定义(或声明):
只能用于函数,不能用于类、模板、重载函数不支持C++特性:不能有默认参数、引用、类对象参数/返回值、异常说明等
// helper.cppextern "C" { int multiply(int x, int y) { return x * y; }void log_info(const char* msg) { printf("[INFO] %sn", msg);}
}
然后在C文件中声明并调用即可:
// main.cextern int multiply(int, int);extern void log_info(const char*);int main() {int r = multiply(6, 7);log_info("done");return 0;}
单个函数临时声明(不改头文件时用)
如果无法修改C头文件(比如第三方闭源库只有 .h + .lib),可在C++源文件中手动加 extern "C" 声明:
// main.cppextern "C" {#include "legacy_api.h" // 假设这个头文件没加 __cplusplus 判断}int main() {legacy_init(); // 正常调用return 0;}
注意:extern "C" 块内不能出现C++特有语法(如类、new、模板),所以只适合纯C风格头文件。
基本上就这些。关键就两点:头文件里加 __cplusplus 宏判断 + extern "C" 包裹;或者在C++源码里显式用 extern "C" 声明/定义。不复杂但容易忽略。
以上就是C++如何调用C语言函数?(extern "C"用法)的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489448.html
微信扫一扫
支付宝扫一扫