extern “c“使用问题

关于和同事讨论 "extern "c" 应该只会出现在.h文件?

extern "c"使用位置

首先,先看下AI的回答

关于在C文件中是否需要添加 extern "C" 的问题,答案通常是不需要。让我解释一下原因和相关细节:

C文件与C++文件的区别:

.c 文件默认被编译器视为C代码
.cpp(或 .cxx, .cc 等)文件默认被视为C++代码


extern "C" 的作用:

extern "C" 主要用于C++代码中,告诉C++编译器以C的方式编译某些函数或代码块
它的主要目的是防止C++编译器对函数名进行名称修饰(name mangling),以保持C语言的链接方式


C文件中的情况:

C编译器不识别 extern "C" 语法
C文件中的函数默认就是以C的方式编译和链接的,不需要特殊声明


何时使用 extern "C":

在C++代码中包含C语言头文件时
在C++代码中声明要被C代码调用的函数时
在头文件中,如果该头文件可能被C和C++同时包含

我们不使用任何.h文件
xx.cpp

#include <iostream>

/*  C文件函数在cpp中声明并调用 */
#ifdef __cplusplus
extern "C" {
#endif
  extern void test_c(void);
#ifdef __cplusplus
}
#endif

/* CPP中定义c函数给 c文件调用 */
#ifdef __cplusplus
extern "C" {
#endif
  void cpp_func_c(void)
  {
    printf("call c++ ok\r\n");
  }
#ifdef __cplusplus
}
#endif
int main()
{
  std::cout << "Hello World!\n";
  test_c();
  return 0;
}

xx.c

#include <stdio.h>
extern void cpp_func_c(void);

/* 这里的extern "c"无意义,c文件会被c编译器编译,__cplusplus宏为 未定义状态 */
#ifdef __cplusplus
extern "C" {
#endif
  void test_c(void)
  {
    printf("call c ok\r\n");
    cpp_func_c();
  }
#ifdef __cplusplus
  }
#endif

总结:C++文件 中函数需要给 C文件 中函数使用 或者 自己使用外部C函数,需要加extern “c”,无关乎是否为.h文件,而是关键在于该文件是否为c++编译器编译

c调用c++

要在C函数中调用C++函数,主要有以下几种方法:

使用extern “C”

在C++代码中,可以用extern "C"声明要给C调用的函数:

C++文件

extern "C" {
    void cppFunction() {
        // C++函数实现
    }
}

这样C代码就可以直接调用该函数:

C文件

void cppFunction(); // 声明函数

int main() {
    cppFunction(); // 调用C++函数
    return 0;
}

使用C风格的函数封装

在C++中实现一个C风格的函数,内部调用C++函数:

C++文件

void cppFunction() {
    // C++函数实现
}

extern "C" {
    void cWrapper() {
        cppFunction(); // 调用C++函数
    }
}

C代码可以调用这个C风格的封装函数:
C文件

void cWrapper(); // 声明函数

int main() {
    cWrapper(); // 间接调用C++函数
    return 0;
}

使用函数指针

在C++中创建一个函数指针,指向C++函数:
C++文件

void cppFunction() {
    // C++函数实现
}

extern "C" {
    typedef void (*FuncPtr)();
    FuncPtr getFunction() {
        return &cppFunction;
    }
}

C代码可以获取并使用这个函数指针:
C文件

typedef void (*FuncPtr)();
FuncPtr getFunction();

int main() {
    FuncPtr func = getFunction();
    func(); // 调用C++函数
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aron566

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

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

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

打赏作者

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

抵扣说明:

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

余额充值