FX-extern C

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  • C++调用C语言编写的函数

    • 当C++代码必要调用C语言编写的函数时,使用extern "C"告诉编译器按照C语言的方式处理处罚函数名。

  • C语言调用C++编写的函数

    • 当C语言代码必要调用C++编写的函数时,使用extern "C"确保函数名不被修饰。

  • 与C语言库交互

    • 很多体系库或第三方库是用C语言编写的,使用extern "C"可以确保C++代码能够正确链接这些库。


extern "C"的语法

extern "C"可以用于单个函数、多个函数或整个头文件。
1. 单个函数

  1. extern "C" void myFunction(int a, int b);
复制代码
2. 多个函数

  1. extern "C" {
  2.     void function1(int a);
  3.     void function2(double b);
  4. }
复制代码
3. 整个头文件

  1. extern "C" {
  2.     #include "my_c_library.h"
  3. }
复制代码

示例:C++调用C语言函数

假设有一个C语言编写的函数,必要在C++中调用。
C语言代码(my_c_code.c)

  1. #include <stdio.h>
  2. void myCFunction() {
  3.     printf("This is a C function.\n");
  4. }
复制代码
C++代码(main.cpp)

  1. #include <iostream>
  2. // 告诉编译器 myCFunction 是用 C 语言编写的
  3. extern "C" void myCFunction();
  4. int main() {
  5.     std::cout << "Calling a C function from C++..." << std::endl;
  6.     myCFunction();  // 调用 C 语言函数
  7.     return 0;
  8. }
复制代码
编译和链接


  • 编译C语言代码:
    1. gcc -c my_c_code.c -o my_c_code.o
    复制代码
  • 编译C++代码:
    1. g++ -c main.cpp -o main.o
    复制代码
  • 链接天生可执行文件:
    1. g++ main.o my_c_code.o -o my_program
    复制代码
  • 运行程序:
    1. ./my_program
    复制代码
输出:
  1. Calling a C function from C++...
  2. This is a C function.
复制代码

示例:C语言调用C++函数

假设有一个C++编写的函数,必要在C语言中调用。
C++代码(my_cpp_code.cpp)

  1. #include <iostream>
  2. // 告诉编译器 myCppFunction 使用 C 语言的链接方式
  3. extern "C" void myCppFunction() {
  4.     std::cout << "This is a C++ function." << std::endl;
  5. }
复制代码
C语言代码(main.c)

  1. #include <stdio.h>
  2. // 声明 C++ 函数
  3. void myCppFunction();
  4. int main() {
  5.     printf("Calling a C++ function from C...\n");
  6.     myCppFunction();  // 调用 C++ 函数
  7.     return 0;
  8. }
复制代码
编译和链接


  • 编译C++代码:
    1. g++ -c my_cpp_code.cpp -o my_cpp_code.o
    复制代码
  • 编译C语言代码:
    1. gcc -c main.c -o main.o
    复制代码
  • 链接天生可执行文件:
    1. g++ main.o my_cpp_code.o -o my_program
    复制代码
  • 运行程序:
    1. ./my_program
    复制代码
输出:
  1. Calling a C++ function from C...
  2. This is a C++ function.
复制代码

注意事项


  • 名称修饰

    • C++编译器会对函数名进行名称修饰以支持函数重载,而C语言不会。使用extern "C"可以克制名称修饰。

  • 函数重载

    • 在extern "C"块中不能定义重载函数,因为C语言不支持函数重载。

  • C++特性

    • 在extern "C"块中不能使用C++特有的特性(如类、模板、命名空间等)。

  • 头文件保护

    • 如果头文件可能被C和C++代码同时包含,可以使用以下方式保护:
      1. #ifdef __cplusplus
      2. extern "C" {
      3. #endif
      4. void myFunction(int a, int b);
      5. #ifdef __cplusplus
      6. }
      7. #endif
      复制代码


总结



  • extern "C"用于在C++和C语言之间实现互操作。
  • 它告诉编译器按照C语言的方式处理处罚函数或变量的链接,克制名称修饰。
  • 常用于C++调用C语言库,大概C语言调用C++函数。
  • 使用时必要注意C和C++的语法和特性差异。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表