美文网首页
C++/C混编,extern "C"用法

C++/C混编,extern "C"用法

作者: cabin523 | 来源:发表于2019-10-21 15:54 被阅读0次

在c++代码中调用c语言代码,往往会报如下链接错误:


WX20191021-143538@2x.png

LNK2019 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),该符号在函数 _main 中被引用

这里报错的原因是 由于c编译的方式和c++编译方式不一致,如果不声明清楚哪些函数是c语言的,就会导致在链接阶段无法成功找到sum函数的具体地址

解决方式,加入extern "C" 进行修饰,让编译器以C语言的方式编译C语言的函数:

//main.cpp
#include <iostream>
using namespace std;

extern "C" {
    int sum(int a, int b);
}

int main()
{
    cout << sum(1, 2) << endl;
    cout << "Hello World!\n";
}

通常情况,对于c语言的函数声明,比较好的做法是抽出单独的.h文件,但是这样就会导致c++文件和c文件都可能会#include该.h文件,从而导致编译失败。

所以在所有的c++文件中,编译器默认定义了一个头变量宏:#define __cplusplus ,但是c语言文件中,没有这个宏,因此用这个方法可以区分文件到底是c语言环境还是c++环境,所以在标准c头文件,需要提供给c++调用的时候,往往c头文件采用如下策略:

//test.h 头文件
#pragma once

#ifdef __cplusplus
extern "C" {
#endif
    //可能提供给c++调用的函数
    int sum(int a, int b);

#ifdef __cplusplus
}
#endif

相关文章

网友评论

      本文标题:C++/C混编,extern "C"用法

      本文链接:https://www.haomeiwen.com/subject/lsjtvctx.html