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

在c++代碼中調(diào)用c語言代碼,往往會(huì)報(bào)如下鏈接錯(cuò)誤:


WX20191021-143538@2x.png

LNK2019 無法解析的外部符號 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),該符號在函數(shù) _main 中被引用

這里報(bào)錯(cuò)的原因是 由于c編譯的方式和c++編譯方式不一致,如果不聲明清楚哪些函數(shù)是c語言的,就會(huì)導(dǎo)致在鏈接階段無法成功找到sum函數(shù)的具體地址

解決方式,加入extern "C" 進(jìn)行修飾,讓編譯器以C語言的方式編譯C語言的函數(shù):

//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語言的函數(shù)聲明,比較好的做法是抽出單獨(dú)的.h文件,但是這樣就會(huì)導(dǎo)致c++文件和c文件都可能會(huì)#include該.h文件,從而導(dǎo)致編譯失敗。

所以在所有的c++文件中,編譯器默認(rèn)定義了一個(gè)頭變量宏:#define __cplusplus ,但是c語言文件中,沒有這個(gè)宏,因此用這個(gè)方法可以區(qū)分文件到底是c語言環(huán)境還是c++環(huán)境,所以在標(biāo)準(zhǔn)c頭文件,需要提供給c++調(diào)用的時(shí)候,往往c頭文件采用如下策略:

//test.h 頭文件
#pragma once

#ifdef __cplusplus
extern "C" {
#endif
    //可能提供給c++調(diào)用的函數(shù)
    int sum(int a, int b);

#ifdef __cplusplus
}
#endif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容