C/C++混合程式設計--extern “C” 使用方法詳解
阿新 • • 發佈:2018-12-05
1. 首先要明白:
被extern “C”修飾的變數和函式是按照C語言方式編譯和連結的
(1) 首先看看C++中對類似C的函式是怎樣編譯的。
C++支援函式過載,而過程式語言C則不支援。函式被C++編譯後在符號庫中的名字與C語言的不同。例如,假設某個函式的原型為:
void foo( int x, int y );
該函式被C編譯器編譯後在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名、函式引數數量及型別資訊,C++就是靠這種機制來實現函式過載的。
2. 在C++和C混合程式設計時:
在C++和C語言混合程式設計時,C++的語法是完全包含C語言的語法的,所以不用擔心語法上出現什麼問題。出現問題的主要原因在編譯
錯誤的案例:
//head.h 標頭檔案
void print(int a, int b);
-----------------------------------
//head.c C語言的實現檔案
#include <stdio.h>
#include "head.h"
void print(int a, int b)
{
printf("這裡呼叫的是C語言的函式:%d,%d\n", a, b);
}
-----------------------------------
//main.cpp 呼叫head.h中的print函式
#include "head.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
print(1, 2);
return(0);
}
錯誤資訊:1>main.obj : error LNK2019: 無法解析的外部符號 “void __cdecl print(int,int)” ([email protected]@[email protected]),該符號在函式 _main 中被引用
正確的案例:C++/C混合程式設計的萬能公式
解決方案:僅僅需要在head.h標頭檔案中,新增#ifdef __cplusplus extern “C”
//head.h 標頭檔案
#ifdef __cplusplus //如果當前使用的是C++編譯器
extern "C" { //用C的方式編譯宣告的函式
#endif
extern void print(int a, int b);
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
-----------------------------------
//head.c C語言的實現檔案
#include <stdio.h>
#include "head.h"
void print(int a, int b)
{
printf("這裡呼叫的是C語言的函式:%d,%d\n", a, b);
}
-----------------------------------
//main.cpp 呼叫head.h中的print函式
#include "head.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
print(1, 2);
return(0);
}