跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ extern C
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++ extern "C" = == 介绍 == '''extern "C"''' 是C++中用于与C语言进行交互的关键字,它告诉C++编译器按照C语言的规则处理函数名和调用约定。由于C++支持函数重载,编译器会对函数名进行'''名称修饰(Name Mangling)''',而C语言没有这一特性。因此,当C++代码需要调用C语言编写的函数或库时,必须使用'''extern "C"'''来避免链接错误。 == 语法 == extern "C"可以用于单个函数声明或整个代码块: <syntaxhighlight lang="cpp"> // 单个函数声明 extern "C" void c_function(int x); // 代码块形式 extern "C" { void c_function1(int x); void c_function2(double y); } </syntaxhighlight> == 名称修饰(Name Mangling) == C++编译器会对函数名进行修饰,以支持函数重载和命名空间等特性。例如,函数`void foo(int)`可能被修饰为`_Z3fooi`。而C语言没有名称修饰,函数名在编译后保持不变。 <mermaid> graph LR A[C++函数] -->|名称修饰| B[_Z3fooi] C[C函数] -->|无修饰| D[foo] </mermaid> == 实际应用场景 == === 调用C库函数 === 当C++程序需要调用C标准库或其他C语言编写的库时,必须使用extern "C"。 <syntaxhighlight lang="cpp"> // C头文件 math_operations.h #ifdef __cplusplus extern "C" { #endif int add(int a, int b); #ifdef __cplusplus } #endif </syntaxhighlight> === 在C++中实现C接口 === 如果需要在C++中编写供C语言调用的函数,也需要使用extern "C"。 <syntaxhighlight lang="cpp"> // cpp_implementation.cpp extern "C" { void print_message(const char* msg) { std::cout << msg << std::endl; } } </syntaxhighlight> == 混合编程示例 == 以下是一个完整的C++调用C函数的例子: '''C代码 (clib.c):''' <syntaxhighlight lang="c"> #include <stdio.h> void c_print(const char* message) { printf("C says: %s\n", message); } </syntaxhighlight> '''C++代码 (cppmain.cpp):''' <syntaxhighlight lang="cpp"> #include <iostream> extern "C" { void c_print(const char* message); } int main() { c_print("Hello from C++!"); return 0; } </syntaxhighlight> '''编译与运行:''' <pre> # 编译C代码 gcc -c clib.c -o clib.o # 编译C++代码并链接 g++ cppmain.cpp clib.o -o program # 运行 ./program 输出: C says: Hello from C++! </pre> == 注意事项 == 1. extern "C"只能用于全局函数,不能用于类成员函数 2. 使用条件编译确保只在C++环境下生效: <syntaxhighlight lang="cpp"> #ifdef __cplusplus extern "C" { #endif // 函数声明 #ifdef __cplusplus } #endif </syntaxhighlight> 3. 函数参数和返回类型必须使用C兼容的类型 == 数学公式表示 == 从C++调用C函数的过程可以表示为: <math> \text{C++代码} \xrightarrow[\text{extern "C"}]{\text{无名称修饰}} \text{C函数} </math> == 总结 == extern "C"是C++与C语言交互的重要机制,它: * 禁用C++的名称修饰 * 确保函数使用C语言的调用约定 * 使得C++可以调用C函数,反之亦然 * 广泛应用于系统编程、嵌入式开发和跨语言库开发中 正确使用extern "C"可以避免链接错误,实现C/C++混合编程的无缝对接。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 与 C 交互]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)