在C和C++混合編程的項目中,難免要相互調用對方的函數,如果不做特殊處理,就很容易出現編譯出錯的問題。
C中調用C++的函數,在C++文件中已實現的函數,通過#include包含的.h文件可以找到,但提示函數未定義(undefined)。這是什麼原因呢?
如我們定義了一個函數。如:
int func(int t)
{
//function
return 0;
}
C編譯器會將此函數編譯成類似_func的符號,C連接器只要找到了調用函數的符號,就認爲鏈接成功。而C++編譯器爲了實現函數的重載,會再編譯時帶上函數的信息,將上面的函數編譯成類似_func_int這樣的符號。所以在C函數中調用C++中調用的函數時,編譯器提示函數未定義。
我們只需要在C++文件和.h文件中,加入extern “c” {},告訴編譯器此C++文件依照C的方式來編譯封裝接口,函數實現還是依照C++語法和C++方式來編譯。如:
l func.c文件
#ifdef __cplusplus
extern “C” {
#endif
int func(int t)
{
//function
return 0;
}
#ifdef __cplusplus
}
#endif
l func.h文件
#ifdef __cplusplus
extern “C” {
#endif
#ifndef __FUNC_H__
#define __FUNC_H__
int func(int t);
#endif
#ifdef __cplusplus
}
#endif
其中__cplusplus是C++編譯器的保留宏定義。extern “C” {}是高手C++編譯器{}裏面的函數按照C的編譯格式來編譯和鏈接。
這樣,就可以在C函數中調用C++函數,也可以在C++函數中調用C的函數。