程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C中沒有函數重載

C中沒有函數重載

編輯:關於C語言

學習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的編譯方法來編譯!??

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved