學習C/C++這麼多年,我卻被一種坑爹的知識點輪奸了好多回! “函數的重載,一直都是C的標准!”???????? 你是否也深深的被這個想法侵蝕,是否覺得C語言裡面有,函數的重載是件天經地義的事! 那麼我現在要恭喜你,你也中標了! 標准的C語言裡,沒有函數的重載。 [cpp] 以下代碼都是在vs2010編譯器下 extern "C" { void MyTestFun(int nArray) { printf("MyTestFun\n"); } void MyTestFun(char *strArray) { printf("MyTestFun:%s\n",strArray); } } //編譯器會報錯 error C2733: second C linkage of overloaded function 'MyTestFun' not allowed 不僅僅如此,而且"一個函數名只能有一個定義,但是可以有多種申明。 一個函數名只能有一個定義,但是可以有多種申明,和調用 [cpp] 如:程序A //在一個stdafx.cpp文件中定義 extern "C" { void MyTestFun(int n) { printf("MyTestFun: %d", n); } }; //在另一個cpp文件裡不同的申明和調用,當然申明和調用必須一致(必須在於上一個不同的cpp文件中) extern "C" void MyTestFun( int, int ); int _tmain(int argc, _TCHAR* argv[]) { MyTestFun(1 , 2); return 0; } //輸出結果:MyTestFun: 1 _tmain函數就是一個標准的C函數 我們的_tmain函數就是一個標准的C函數,所以我們的_tmain函數就可以定義為如下多種形式: int _tmain(void); int _tmain(int argc) int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[],wchar_t * envp[]) .... [cpp] 1)在tchar.h文件裡將_tmain宏定義:#define _tmain main 2)在internal.h文件裡申明和調用了wmain extern "C" { ... int __CRTDECL wmain(_In_ int _Argc, _In_count_(_Argc) _Pre_z_ wchar_t ** _Argv, _In_z_ wchar_t ** _Env); ... __declspec(noinline) int __tmainCRTStartup( void ) { ... #ifdef WPRFLAG __winitenv = envp; mainret = wmain(argc, argv, envp); #else /* WPRFLAG */ __initenv = envp; mainret = main(argc, argv, envp); #endif /* WPRFLAG */ ... } ... } 我 有一個問題 但是我有一個問題,就是,如果我們上面的程序A變成如下程序B: [cpp] 程序B stdafx.cpp中 void MyTestFun(int n)//定義是不定義為C函數 { printf("MyTestFun: %d", n); } 另一個cpp中 extern "C" void MyTestFun( int, int ); int _tmain(int argc, _TCHAR* argv[]) { MyTestFun(1 , 2); return 0; } //這樣編譯通不過,error LNK2019: unresolved external symbol _MyTestFun referenced in function _wmain 很明顯,c和c++的函數編譯時都會在函數名上做手腳(這也是C++函數重載的實現方法),但做手腳的方法不一樣, 定義和聲明的MyTestFun()函數在編譯器做完做完手腳後名字就不一樣了,所以編譯器找不到MyTestFun()函數的定義, 但是_tmain()的定義沒有加extern "C"卻不會有這種情況,是不是編譯器將_tmain()做了特殊處理,是不是在編譯器裡設置下就可以指定我們的函數也能像_tmain一樣讓函數編譯在cpp文件裡按c的編譯方法來編譯!??