FX-extern C

  1. C++调用C语言编写的函数

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

    • 当C语言代码需要调用C++编写的函数时,使用extern "C"确保函数名不被修饰。
  3. 与C语言库交互

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

extern "C"的语法

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

1. 单个函数
cpp 复制代码
extern "C" void myFunction(int a, int b);
2. 多个函数
cpp 复制代码
extern "C" {
    void function1(int a);
    void function2(double b);
}
3. 整个头文件
cpp 复制代码
extern "C" {
    #include "my_c_library.h"
}

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

假设有一个C语言编写的函数,需要在C++中调用。

C语言代码(my_c_code.c
cpp 复制代码
#include <stdio.h>

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

// 告诉编译器 myCFunction 是用 C 语言编写的
extern "C" void myCFunction();

int main() {
    std::cout << "Calling a C function from C++..." << std::endl;
    myCFunction();  // 调用 C 语言函数
    return 0;
}
编译和链接
  1. 编译C语言代码:

    cpp 复制代码
    gcc -c my_c_code.c -o my_c_code.o
  2. 编译C++代码:

    cpp 复制代码
    g++ -c main.cpp -o main.o
  3. 链接生成可执行文件:

    cpp 复制代码
    g++ main.o my_c_code.o -o my_program
  4. 运行程序:

    cpp 复制代码
    ./my_program

输出:

cpp 复制代码
Calling a C function from C++...
This is a C function.

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

假设有一个C++编写的函数,需要在C语言中调用。

C++代码(my_cpp_code.cpp
cpp 复制代码
#include <iostream>

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

// 声明 C++ 函数
void myCppFunction();

int main() {
    printf("Calling a C++ function from C...\n");
    myCppFunction();  // 调用 C++ 函数
    return 0;
}
编译和链接
  1. 编译C++代码:

    cpp 复制代码
    g++ -c my_cpp_code.cpp -o my_cpp_code.o
  2. 编译C语言代码:

    bash 复制代码
    gcc -c main.c -o main.o
  3. 链接生成可执行文件:

    cpp 复制代码
    g++ main.o my_cpp_code.o -o my_program
  4. 运行程序:

    cpp 复制代码
    ./my_program

输出:

cpp 复制代码
Calling a C++ function from C...
This is a C++ function.

注意事项

  1. 名称修饰

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

    • extern "C"块中不能定义重载函数,因为C语言不支持函数重载。
  3. C++特性

    • extern "C"块中不能使用C++特有的特性(如类、模板、命名空间等)。
  4. 头文件保护

    • 如果头文件可能被C和C++代码同时包含,可以使用以下方式保护:

      cpp 复制代码
      #ifdef __cplusplus
      extern "C" {
      #endif
      
      void myFunction(int a, int b);
      
      #ifdef __cplusplus
      }
      #endif

总结

  • extern "C"用于在C++和C语言之间实现互操作。

  • 它告诉编译器按照C语言的方式处理函数或变量的链接,避免名称修饰。

  • 常用于C++调用C语言库,或者C语言调用C++函数。

  • 使用时需要注意C和C++的语法和特性差异。

相关推荐
Fuyo_11191 分钟前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
在角落发呆2 分钟前
跨越网络鸿沟:传统文件传输与现代内网穿透的奇妙交响
开发语言·php
Season4506 分钟前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
AI玫瑰助手8 分钟前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
计算机安禾31 分钟前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式
LuminousCPP42 分钟前
数据结构 - 线性表第三篇:基于顺序表实现 C 语言通讯录(基础功能篇)
c语言·数据结构·经验分享·笔记·算法
_日拱一卒1 小时前
LeetCode:114二叉树展开为链表
java·开发语言·算法
天天进步20151 小时前
从零打造 Python 全栈项目:智能教学辅助系统
开发语言·人工智能·python
kkeeper~1 小时前
0基础C语言积跬步之内存函数
c语言·开发语言
吃好睡好便好1 小时前
在Matlab中绘制杆状图
开发语言·学习·算法·matlab·信息可视化