亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

精華:C++編程新手錯誤語錄(續一)

2019-11-17 05:03:39
字體:
來源:轉載
供稿:網友
  廢話不說,直接進入正題,本文承接先前發布的《C/C++編程新手錯誤語錄》(http://www.pconline.com.cn/pcedu/empolder/gj/c/0508/691597.Html),繼續歸納錯誤語錄。
(8)“我想用malloc”、“我用不好malloc”
  來看看一個變態程序:
/* xx.c:xx模塊實現文件 */
int *pInt;
/* xx模塊的初始化函數 */
xx_intial()
{
pInt = ( int * ) malloc ( sizeof( int ) );
...
}
/* xx模塊的其他函數(僅為舉例)*/
xx_otherFunction()
{
*Int = 10;
...
}
  這個程序定義了一個全局整型變量指針,在xx模塊的初始化函數中對此指針動態申請內存,并將pInt指向該內存首地址,并在xx模塊的其他函數中都使用pInt指針對其指向的整數進行讀取和賦值。

  這個程序讓我痛不欲生了好多天,扼腕嘆息!這是我母校計算機系一位碩士的作品!作者為了用上malloc,拼命地把本來應該用一個全局整型變量擺平的程序活活弄成一個全局整型指針并在初始化函數中“動態”申請內存,自作聰明而正好暴露自己的無知!我再也不要見到這樣的程序。

  那么malloc究竟應該怎么用?筆者給出如下規則:
  規則1 不要為了用malloc而用malloc,malloc不是目的,而是手段;

  規則2 malloc的真正內涵體現在“動態”申請,假如程序的特性不需動態申請,請不要用malloc;

  上面列舉的變態程序完全不具備需要動態申請的特質,應該改為:
/* xx.c:xx模塊實現文件 */
int example;
/* xx模塊的初始化函數 */
xx_intial()
{
...
}
/* xx模塊的其他函數(僅為舉例) */
xx_otherFunction()
{
example = 10;
...
}
更多文章 更多內容請看C/C++技術專題  java編程開發手冊專題,或
  規則3 什么樣的程序具備需要動態申請內存的特質呢?包含兩種情況:
  (1)不知道有多少要來,來了的又走了
  不明白?這么說吧,譬如你正在處理一個報文隊列,收到的報文你都存入該隊列,處理完隊列頭的報文后你需要取出隊列頭的元素。

  你不知道有多少報文來(因而你不知道應該用多大的報文數組),這些來的報文處理完后都要走(釋放),這種情況適合用malloc和free。

  (2)慢慢地長大
  譬如你在資源受限的系統中編寫一文本編輯器程序,你怎么做,你需要這樣定義數組嗎?
  char str[10000];  不,你完全不應該這么做。即使你定義了一個10000字節大的字符串,用戶假如輸入10001個字符你的程序就完完了。

  這個時候適合用malloc,因為你根本就不知道用戶會輸入多少字符,文本在慢慢長大,因而你也應慢慢地申請內存,用一個隊列把字符串存放起來。

  那么是不是應該這樣定義數據結構并在用戶每輸入一個字符的情況下malloc一個CharQueue空間呢?
typedef strUCt tagCharQueue

{
char ch;
struct tagCharQueue *next;
}CharQueue;
  不,這樣做也不對!這將使每個字符占據“1+指針長度”的開銷。

  正確的做法是:
typedef struct tagCharQueue
{
char str[100];
struct tagCharQueue *next;
}CharQueue;
  讓字符以100為單位慢慢地走,當輸入字符數達到100的整數倍時,申請一片CharQueue空間。

更多文章 更多內容請看C/C++技術專題  Java編程開發手冊專題,或
  規則4 malloc與free要成對出現
  它們是一對恩愛夫妻,malloc少了free就必然會慢慢地死掉。成對出現不僅體現在有多少個malloc就應該有多少個free,還體現在它們應盡量出現在同一函數里,“誰申請,就由誰釋放”,看下面的程序:
char * func(void)
{
char *p;
p = (char *)malloc(…);
if(p!=NULL)
…; /* 一系列針對p的操作 */
return p;
}
/*在某處調用func(),用完func中動態申請的內存后將其free*/
char *q = func();

free(q);
  上述代碼違反了malloc和free的“誰申請,就由誰釋放”原則,代碼的耦合度大,用戶在調用func函數時需確切知道其內部細節!正確的做法是:
/* 在調用處申請內存,并傳入func函數 */
char *p=malloc(…);
if(p!=NULL)
{
func(p);

free(p);
p=NULL;
}
/* 函數func則接收參數p */
void func(char *p)
{
… /* 一系列針對p的操作 */
}
  規則5 free后一定要置指針為NULL,防止其成為“野”指針

(9)“函數add編譯生成的符號就是add”
int add(int x,int y)
{
return x + y;
}
float add(float x,float y)
{
return x + y;
}
更多文章 更多內容請看C/C++技術專題  Java編程開發手冊專題,或
  即便是在C語言中,add函數被多數C編譯器編譯后在符號庫中的名字也不是add,而是_add。
而在C++編譯器中,int add(int x,int y)會編譯成類似_add_int_int這樣的名字(稱為“mangled name”),float add(float x,float y)則被編譯成_add_float _float,mangled name包含了函數名、函數參數數量及類型信息,C++依靠這種機制來實現函數重載。

  所以,在C++中,本質上int add( int x, int y )與float add( float x, float y )是兩個完全不同的函數,只是在用戶看來其同名而已。

  這就要求初學者們能透過語法現象看問題本質。本質上,語言的創造者們就是在玩各種各樣的花樣,以使語言具備某種能力,譬如mangled name花樣的目的在于使C++支持重載。而C語言沒有玩這樣的花樣,所以int add( int x, int y )與float add( float x, float y )不能在C程序中同時存在。

(10)“沒見過在C語言中調用C++的函數”、“C/C++不能調用Basic、Pascal語言的函數”
  這又是一個奇天下之大怪的問題,“打死我都不相信C、C++、basic、pascal的函數能瞎調來調去”,可是有句話這么說:
  沒有你見不到的,只有你想不到的!

  既然芙蓉姐姐也有其聞名天下的道理,那么C、C++、Basic、Pascal的函數為什么就不能互相調用呢?
  能!

  你可以用Visual C++寫一個DLL在Visual Basic、Delphi(Pascal的孫子,Object Pascal的兒子)中調用,也可以在Visual Basic、Delphi中寫一個DLL在Visual C++中調用不是?


  讓我們來透過現象看本質。首先看看函數的調用約定(以Visual C++來說明):
  (1) _stdcall調用
  _stdcall是Pascal程序的缺省調用方式,參數采用從右到左的壓棧方式,被調函數自身在返回前清空堆棧。
  WIN32 Api都采用_stdcall調用方式,這樣的宏定義說明了問題:
  #define WINAPI _stdcall  按C編譯方式,_stdcall調用約定在輸出函數名前面加下劃線,后面加“@”符號和參數的字節數,形如_functionname@number。

更多文章 更多內容請看C/C++技術專題  Java編程開發手冊專題,或
  (2) _cdecl調用
  _cdecl是C/C++的缺省調用方式,參數采用從右到左的壓棧方式,傳送參數的內存棧由調用者維護。_cedcl約定的函數只能被C/C++調用,每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。

  由于_cdecl調用方式的參數內存棧由調用者維護,所以變長參數的函數能(也只能)使用這種調用約定。關于C/C++中變長參數(…)的問題,筆者將另文詳述。

  由于Visual C++默認采用_cdecl 調用方式,所以VC中中調用DLL時,用戶應使用_stdcall調用約定。
  按C編譯方式,_cdecl調用約定僅在輸出函數名前面加下劃線,形如_functionname。

  (3) _fastcall調用
  _fastcall調用較快,它通過CPU內部寄存器傳遞參數。

  按C編譯方式,_fastcall調用約定在輸出函數名前面加“@”符號,后面加“@”符號和參數的字節數,形如@functionname@number。

  要害字_stdcall、_cdecl和_fastcall可以直接加在函數前,也可以在Visual C++中設置,如圖1。
精華:C++編程新手錯誤語錄(續一)  圖1 在VC中設置函數調用約定  在創建DLL時,一般使用_stdcall調用(Win32 Api方式),采用_functionname@number命名規則,因而各種語言間的DLL能互相調用。也就是說,DLL的編制與具體的編程語言及編譯器無關,只要遵守DLL的開發規范和編程策略,并安排正確的調用接口,不管用何種編程語言編制的DLL都具有通用性。

  推而廣之,假如有這樣一個IDE開發環境,它能識別各種語言,所有語言采用相同的調用約定和命名規則,一個軟件內各種語言書寫的函數將能互相調用!

  這個世界上可能永遠不需要這樣一個IDE。

(11)“英語、數學不好就學不好C/C++”
更多文章 更多內容請看C/C++技術專題  Java編程開發手冊專題,或
  這也許是20世紀最大的謊言,這句話最先是哪位大師的名人名言已無可考證,可此后一批批的人被它誤導。許多初學者因為這句話被嚇倒,放棄了做程序員的理想。
還有許多后來成為優秀程序員的人,在他們的成長過程中并沒有依靠深奧的數學,可他們還是在總結經驗時制造恐慌,號稱一定要具備高深的數學知識,唯恐別人笑話其學術水平不高。

  在下則認為,大多數情況下,程序設計不需要太深奧的數學功底,除非你所從事的程序設計涉及特定的專業領域(如語音及圖像處理、數字通信技術等)。在下這一觀點也許是革舊立新,而革命必然要流血犧牲(譚嗣同),所以恭候大家板磚。

  那么英語在C/C++的學習中處于什么地位呢?那就是能看懂資料,看懂MSDN。

  學編程的終極之道不在看書,而在大量地不斷地實踐。

(12)“C++太難了,我學不會”

  又不知是誰的悲觀論調,許多初學者被C++嚇倒,“太難了,我學不好”,如弱者自憐。假如C++真的難到學不會,那么C++的創造者們所從事的工作豈不是“非人力所能及也”?  
 
  在下認為,學習C++的態度應該是:戰略上藐視它,戰術上重視它,要敢于勝利(《毛主席語錄》)。當然也不可輕敵,不能因為把握了一點皮毛就以為自己牛B轟轟了(筆者曾經牛B轟轟了好一陣子,現在想來,甚覺當時幼稚)。

  假如你征服了C++,透徹理解了C++的語言特性及STL,那么,其他語言想不被你征服都難了。

  本回書著落此處,更多錯誤語錄,當然是待續。
更多文章 更多內容請看C/C++技術專題  Java編程開發手冊專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
懂色aⅴ精品一区二区三区蜜月| 国产一区二区精品丝袜| 欧美性受xxxx白人性爽| 精品久久久久久电影| 日韩成人在线视频网站| 国产精品久久久久aaaa九色| 色yeye香蕉凹凸一区二区av| 亚州国产精品久久久| 欧美老肥婆性猛交视频| 久久精品国产亚洲| 欧美亚洲国产视频小说| 久久精品99国产精品酒店日本| 亚洲日本中文字幕免费在线不卡| 国产精品一区二区av影院萌芽| 爽爽爽爽爽爽爽成人免费观看| 在线电影av不卡网址| 国产精品88a∨| 亚洲第一二三四五区| 69av在线视频| 午夜精品久久17c| 国产亚洲精品成人av久久ww| 亚洲国产97在线精品一区| 日韩中文理论片| 高清一区二区三区四区五区| 欧美另类精品xxxx孕妇| 色午夜这里只有精品| 亚洲国产精品99久久| 97久久精品在线| 日韩精品在线播放| 欧美日韩国产中文精品字幕自在自线| 亚洲精品国产精品国自产观看浪潮| 国产精品久久久久不卡| 91精品国产91久久久久久最新| 最好看的2019的中文字幕视频| 97视频在线免费观看| 26uuu日韩精品一区二区| 亚洲欧洲自拍偷拍| 5566日本婷婷色中文字幕97| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲jizzjizz日本少妇| 国产精品国产三级国产aⅴ9色| 97超碰国产精品女人人人爽| 午夜精品一区二区三区在线视| 色无极影院亚洲| 97久久久免费福利网址| 在线观看中文字幕亚洲| 最近2019年中文视频免费在线观看| 欧美精品免费播放| 国产精品一区二区3区| 欧美老少做受xxxx高潮| 91色中文字幕| 亚洲国产成人久久综合| 久久久91精品国产一区不卡| 成人免费黄色网| 国产91色在线|免| 日韩视频欧美视频| 国产91在线播放九色快色| 中文字幕在线视频日韩| 国产精品视频免费观看www| 77777亚洲午夜久久多人| 国产极品精品在线观看| 国产精品免费久久久| 国产区亚洲区欧美区| 欧美成aaa人片在线观看蜜臀| 亚洲性无码av在线| 一区二区三区视频观看| 亚洲aⅴ男人的天堂在线观看| 亚洲大胆美女视频| 欧美国产日产韩国视频| 97国产精品视频人人做人人爱| 成人精品一区二区三区电影免费| 亚洲最大av在线| 亚洲欧美在线看| 黑人与娇小精品av专区| 日韩精品免费在线播放| 国产精品久久久久久久久久久不卡| 欧美理论在线观看| 国产精品视频一区国模私拍| 亚洲欧美自拍一区| 日韩中文在线视频| 国产精品男人的天堂| 久久精品亚洲热| 国内精品久久久久影院 日本资源| 国产色视频一区| 日韩中文字幕免费看| 国产一区二区三区视频| 福利视频第一区| 欧美日韩中国免费专区在线看| 国产精品爽黄69| 欧美一区三区三区高中清蜜桃| 精品久久久久久久久久久久久| 日韩av综合网站| 亚洲精品视频播放| 国产日韩欧美电影在线观看| 成人免费福利在线| 亚洲va久久久噜噜噜| 日韩高清欧美高清| 久久青草福利网站| www.国产精品一二区| 在线观看国产欧美| 久久久国产精品亚洲一区| 亚洲成**性毛茸茸| 欧美专区日韩视频| 欧美老肥婆性猛交视频| 一区二区三区视频免费| 午夜精品久久久久久久99黑人| 日韩av在线免费观看一区| 91av网站在线播放| 欧美午夜www高清视频| 黑人巨大精品欧美一区二区三区| 国产91精品久久久久| 国产成人综合av| 欧美与欧洲交xxxx免费观看| 亚洲一区二区日本| 亚洲人精选亚洲人成在线| 91精品国产自产在线| 在线看国产精品| 国产精品成熟老女人| 国内免费精品永久在线视频| 91久久久久久国产精品| 国产精品久久久久久久久久久不卡| 97超级碰碰人国产在线观看| 欧美日韩免费区域视频在线观看| 久久国产天堂福利天堂| 精品国产欧美一区二区三区成人| 精品一区二区三区三区| 日韩av网站导航| 久久精品夜夜夜夜夜久久| 亚洲精品国产成人| 亚洲最新视频在线| 久青草国产97香蕉在线视频| 77777少妇光屁股久久一区| 亚洲欧美在线第一页| 国产成人a亚洲精品| 亚洲毛片一区二区| 日韩国产欧美精品一区二区三区| 亚洲爱爱爱爱爱| 成人精品一区二区三区| 国产一区二区三区视频| 国产精品第一视频| 国产精品www色诱视频| 欧美成年人视频| 亚洲欧美日韩一区二区三区在线| 91免费视频网站| 国产一区二区三区视频在线观看| 91网站在线看| 亚洲va欧美va在线观看| 亚洲第一精品电影| 97碰碰碰免费色视频| 亚洲国产精品女人久久久| 中文字幕日韩欧美在线| 欧美精品18videos性欧美| 久久久久999| 亚洲一区二区三区久久| 在线免费观看羞羞视频一区二区| 日韩在线精品一区| 成人福利视频在线观看| 久久久视频精品| 日韩av中文字幕在线| 国产精品人成电影在线观看| 国模吧一区二区三区| 欧美伦理91i| 欧美视频一区二区三区…| 免费av在线一区|