c++ 陷阱

.c89 c90 gnu90 c99 c11 c++98( default ) c++03 c++11 gnu++11


bool
C 標準 does not support the boolean data type. include it with this include: #include <stdbool.h>
c++ 標準都支持



extern
    能夠置於變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其餘模塊中尋找其定義。此外extern也可用來進行連接指定。
    extern有兩個做用,第一個,當它與"C"一塊兒連用時,如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個函數名時按着C的規則去翻譯相應的函數名而不是C++的,C++的規則在翻譯這個函數名時會把fun這個名字變得面目全非,多是fun@aBc_int_int#%$也多是別的,這要看編譯器的"脾氣"了(不一樣的編譯器採用的方法不同),爲何這麼作呢,由於C++支持函數的重載。
    第二,當extern不與"C"在一塊兒修飾變量或函數時,如在頭文件中: extern int g_Int; 它的做用就是聲明函數或全局變量的做用範圍的關鍵字,其聲明的函數和變量能夠在本模塊活其餘模塊中使用,記住它是一個聲明不是定義!也就是說B模塊(編譯單元)要是引用模塊(編譯單元)A中定義的全局變量或函數時,它只要包含A模塊的頭文件便可,在編譯階段,模塊B雖然找不到該函數或變量,但它不會報錯,它會在鏈接時從模塊A生成的目標代碼中找到此函數。



for(int i=0;;)
‘for’ loop initial declarations aren't only allowed in C89 c90 gnu90 mode
c++ 標準都支持



數組元素大小是不是 const
c 和 c++ 全部常見標準均支持用變量來初始化數組的大小。



Segmentation fault (core dumped)
段錯誤
一、出現段錯誤時,首先應該想到段錯誤的定義,從它出發考慮引起錯誤的緣由。
二、在使用指針時,定義了指針後記得初始化指針,在使用的時候記得判斷是否爲NULL。
三、在使用數組時,注意數組是否被初始化,數組下標是否越界,數組元素是否存在等。
四、在訪問變量時,注意變量所佔地址空間是否已經被程序釋放掉。
五、在處理變量時,注意變量的格式控制是否合理等。
http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html
scanf("%d",&a); 不是 scanf("%d",a);



char str[2]="hello world!";            字符數超出數組大小,默認會截取數組大小的字符,而且 str[1] 中存放的不是 '\0' 而是 'e', 這樣定義的數組在操做時結果是未定義的,將字符串賦值給數組時結尾必須是 '\0'

數組越界訪問不會報錯,結果是爲定義的。



stray ‘\342’ in program
標點符號錯誤



incompatible implicit declaration of built-in function ‘printf’
沒有引用相應的頭文件
printf            stdio
exit            stdlib
_exit            unistd



implicit declaration of function ‘getline’ [-Wimplicit-function-declaration]
使用的函數要申明
extern ssize_t getline(char **lineptr, size_t *n, FILE *stream);



initialization makes pointer from integer without a cast
int *p = 2;
給指針直接賦具體值會出錯,應該讓指針指向一個變量。



函數返回值爲 char* ,不能將數組做爲左值,由於數組名至關於常量字符指針。



不能直接將字符串賦值給字符數組,可是能夠用 read 和 write 函數來向字符數組中寫入值;輸出數組時只輸出有值的部分。
char arr[10] = "hel";
arr = "exit";            //this is wrong!



不能將字符指針從新指向新的字符指針。
char *buf_1 = "hell";
buf_1 = "hel";            //this is wrong!



用 read/write 從終端讀入文件時,若是輸入的字符串在緩衝區中沒有被讀取完,程序結束後緩衝區剩下的內容會做爲命令在 shell 中自動執行此命令。



dereferencing pointer to incomplete type
使用結構體指針是用符號 ->


使用動態庫時,生成可執行文件,但執行時出錯:
緣由是程序找不到動態庫,將動態庫路徑添加到環境變量 LD_LIBRARY_PATH 中便可。


字符串結束符不要使用 \n ,而須要使用自定義的 EOF。


整形不能直接轉換爲字符型,若是須要遍歷整形的每一位,可用除運算和模運算結合的方法。
除法去掉低位,模 10 獲得個位數。html

相關文章
相關標籤/搜索