extern “C“:在 C++ 中,声明一个 C 代码函数

一、extern " C ":在 C++ 中,声明一个 C 代码函数

在 C++ 中,extern "C" 关键字:用于告诉编译器按照 C 语言的命名规则 对函数进行编译和链接,,而不是按照 C++ 的名称修饰(Name Mangling)规则,从而使得 C++ 代码能够与 C 代码进行互操作。

  • C++ 的名称修饰规则C++ 编译器会对函数名进行名称修饰,以支持函数重载、命名空间等特性。例如,函数 void foo(int) 可能会被修饰为 _Z3fooi。
  • C 语言的命名规则C 语言不支持名称修饰,函数名在编译后的符号表中保持不变。例如,函数 void foo(int) 在 C 中仍然是 foo。
  • C++ 与 C 的互操作:如果 C 代码需要调用 C++ 函数,或者 C++ 代码需要调用 C 函数,就必须使用 extern “C” 来避免名称修饰,确保函数名的兼容性。

理解 C 和 C++ 的编译规则
(1)主要区别:在相同函数下,分别用 C 和 C++ 编译后生成的函数符号不一致
(2)extern " C " 的作用就是告诉C++编译器,将指定的函数用C规则编译

二、注意事项

  • 仅适用于全局函数和变量,不能用于 C++ 类的成员函数(C 语言不支持)或局部变量(作用域仅限于函数内部)。
  • 函数名必须唯一:由于 C 语言不支持函数重载,因此 extern " C " 声明的函数名在 C++ 代码中也不能重载,必须保证全局唯一,以避免名称冲突。
  • extern " C " 主要用于源文件(.cpp),而条件编译用于头文件(.h)
    • 源文件(.cpp):extern " C " 是在源文件中声明需要以 C 语言链接方式调用的函数和变量。
    • 头文件(.h):为了确保在 C++ 中使用 extern “C” 时不会影响 C 编译器,常在头文件中使用 #ifdef __cplusplus 进行条件编译。

三、使用方法(示例)

// (声明单个函数)将 extern "C" 关键字放在了函数声明之前
extern "C" void my_c_function(int arg);			


// (声明多个函数)将函数声明包裹在了花括号{}内
extern "C" 
{
    void my_c_function(int arg);
    void function1();
    void function2(int x);
    int global_variable;
}

//////////////////////////////////////////////////////////
// (支持声明单个、多个函数)使用条件编译:如果 C 语言的函数声明在头文件中(.h),在 C++ 中包含时,建议#ifdef __cplusplus进行处理。
#ifndef MY_C_CODE_H
#define MY_C_CODE_H

#ifdef __cplusplus
extern "C" {  // 让 C++ 编译器使用 C 语言的符号
#endif

void say_hello();
int add(int a, int b);

#ifdef __cplusplus
}
#endif

#endif

四、Visual Studio环境配置 + demo测试

下面是完整的 VS 配置过程,让 C++ 代码调用 C 语言函数,并能在 Windows 环境下成功运行。

方法一、直接使用extern " C "

(1)创建 VS 项目

  • 打开 Visual Studio,点击 " 创建新项目 "。
  • 选择 " 空项目(C++) ",点击 " 下一步 "。
  • 设置项目名称(如 C_Cpp_Interop),点击 " 创建 "。

(2)添加 C 语言源文件 (.c)

  • 在 " 视图 " 的 " 解决方案资源管理器 ",右键 " 源文件 → 添加 → 新建项 "。
  • 选择 C 文件(.c),命名为 my_c_code.c,然后点击 " 添加 "。
  • 输入以下代码:
// my_c_code.c
#include <stdio.h>

void say_hello() {
    printf("Hello from C!\n");
}

int add(int a, int b) {
    return a + b;
}

(3)添加 C++ 源文件 (.cpp) —— 在源文件中(.cpp)声明单 / 多个函数

  • 在 " 视图 " 的 " 解决方案资源管理器 ",右键 " 源文件 → 添加 → 新建项 "。
  • 选择 C++ 文件(.cpp),命名为 main.cpp,点击 " 添加 "。
  • 输入以下代码:
// main.cpp
#include <iostream>

// 声明多个函数(使用块)
extern "C" {
    void say_hello();
    int add(int, int);
}

int main() {
    say_hello();  // 调用 C 语言函数
    int sum = add(3, 5);
    std::cout << "3 + 5 = " << sum << std::endl;
    return 0;
}

(4)运行结果

  • 在 VS 上方工具栏 选择 " Release " 或 " Debug ",并选择 x64 或 x86。
  • 点击 Ctrl + F5(开始执行但不调试),运行程序。

在这里插入图片描述
在这里插入图片描述

方法二、使用条件编译 + extern " C " —— 适用于 C 语言的函数声明在头文件中(.h)

(1)创建 VS 项目

  • 打开 Visual Studio,点击 " 创建新项目 "。
  • 选择 " 空项目(C++) ",点击 " 下一步 "。
  • 设置项目名称(如 C_Cpp_Interop),点击 " 创建 "。

(2)添加 C 语言源文件 (.c)

  • 在 " 视图 " 的 " 解决方案资源管理器 ",右键 " 源文件 → 添加 → 新建项 "。
  • 选择 C 文件(.c),命名为 my_c_code.c,然后点击 " 添加 "。
  • 输入以下代码:
// my_c_code.c
#include <stdio.h>

void say_hello() {
    printf("Hello from C!\n");
}

int add(int a, int b) {
    return a + b;
}

(3)添加 C 语言头文件 (.h) —— 在头文件中(.h)声明单 / 多个函数

  • 在 " 视图 " 的 " 解决方案资源管理器 ",右键 " 头文件 → 添加 → 新建项 "。
  • 选择头文件(.h),命名为 my_c_code.h,点击 " 添加 "。
  • 输入以下代码:
// my_c_code.h
#ifndef MY_C_CODE_H
#define MY_C_CODE_H

#ifdef __cplusplus
extern "C" {  // 让 C++ 代码以 C 语言方式解析符号
#endif

void say_hello();
int add(int a, int b);

#ifdef __cplusplus
}
#endif

#endif

(4)添加 C++ 源文件 (.cpp) —— 在源文件中(.cpp)包含头文件(.h),并调用 C 语言的函数。

  • 在 " 视图 " 的 " 解决方案资源管理器 ",右键 " 源文件 → 添加 → 新建项 "。
  • 选择 C++ 文件(.cpp),命名为 main.cpp,点击 " 添加 "。
  • 输入以下代码:
// main.cpp
#include <iostream>
#include "my_c_code.h"  // 包含 C 语言头文件

int main() {
    say_hello();  // 调用 C 语言函数
    int sum = add(3, 5);
    std::cout << "3 + 5 = " << sum << std::endl;
    return 0;
}

(5)运行结果

  • 在 VS 上方工具栏 选择 " Release " 或 " Debug ",并选择 x64 或 x86。
  • 点击 Ctrl + F5(开始执行但不调试),运行程序。

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值