如下**:
/*c語言標頭檔案:max.h*/
#ifndef _max_h_
#define _max_h_
int max(int na,int nb)
#endif
/*c語言實現檔案:max.c*/
#include "max.h"
int max(int na,int nb)
/*c++語言呼叫檔案*/
#include "max.h"
int _tmain(int argc,char* argv)
上述**在visual c++中編譯會出錯(error lnk2019:無法解析的外部符號"int __cdecl max(int,int)"(?max@@yahhh@z),該符號在函式_wmain中被引用
如果把上述的max.h**修改如下:
/*c語言標頭檔案*/
#ifndef __max_h__
#define __max_h__
#ifdef __cplusplus
extern "c";
#endif
#endif
編譯通過
結論:在c++中呼叫c的**必須把原來的c語言宣告放到extern "c"中,否則在c++中無法編譯通過
例如:假如某一函式原型為:int func(int na,int nb)
c語言編譯器把函式編譯成類似_func的符號,c鏈結器只要找到這個符號就可以連線成功,實現呼叫。而在c++語言中,編譯器會檢查引數型別和作用域資訊,上述函式原型會編譯成_z_func_int_int這樣的符號。在鏈結過程中,c++鏈結器會在函式原型所在模組生成的目標檔案中查詢__z_func_int_int.
總結:c++中呼叫c**的3種具體實現方式
1.修改c**的標頭檔案,當其被用於c++**時,在宣告中加入exter "c" 上例中在max.h中加入extern "c" int max(int na,int nb);
2.在c++**中(main.cpp)重新宣告一下c函式,在重新宣告時新增extern "c".
#include "max.h"
extern "c" int max(int na,int nb);
3.在包含c標頭檔案(main.cpp)時,新增extern "c".
extern "c"
注意:extern "c" 一定要加在c++的**檔案中才起作用
C 資源檔案
獲取資源檔案 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system...
c 資源檔案
參考 system.resources命名空間支援三種資源檔案 1 txt檔案,只能有字串資源。因為不能被嵌入到assembly中,所以很容易暴露,被窗戶修改。不可以直接呼叫,得先將其轉換成resources檔案才能使用 2 resx檔案,由xml組成,可以加入任何資源,包括二進位制,同樣不能被嵌入...
c原始檔中要包含自己的標頭檔案
我們經常在c工程中發現,原始檔中要包含自己的標頭檔案。一直以來,都不知道為什麼這樣做。現在,我知道了。我認為,c檔案沒有必要包含自己的.h檔案。h檔案包含.c檔案中定義的函式和全域性變數的宣告,h檔案就是.c檔案提供的對外介面檔案。既然.h檔案就是.c檔案提供的對外介面檔案,那麼.c檔案就沒必要包含...