1.命名衝突和static修飾符:
如果若干個函式需要共享一組外部物件,可以將這些函式放到乙個原始檔中,把它們需要用到的物件都在同乙個原始檔中以static修飾。static同時也適合函式,如果函式g被函式h呼叫,則將函式g和h放到同乙個檔案中,並且申明g是static。
1.乙個看似正確的程式:
#include using namespace std;
int main()
return 0;
}
這個程式意思很明白:輸入字元不是結束符就把它放到c裡。但實際上卻會因為可能char型別的c無法裝載eof整個資料,或者是資料中間部分可能被截斷而出現錯誤。
1.巨集空格
#define f (x) ((x)-1)
則應該表達為:f是(x)((x)-1)
2.#define abs(x) x>0?x:-x;
本來這個巨集定義是求絕對值,但是abs(a-b)會被展開成a-b>0?a-b:-a-b,這個並不是我們要的結果,所以,應該把x打上括號,就是#define abs(x) (((x)>0)?(x):-(x));
3.在巨集定義時確保引數沒有***,或者直接用函式代替巨集定義就可以。
4.巨集定義不是型別定義:
#define t1 struct foo* t1 a,b; 則被翻譯為:struct foo* a,b;
typedef struct foo *t2; t2 a,b;則被翻譯為: struct foo *a,*b;
1.有符號的奇數進行右移位運算時並不是簡單的除以2,且結果也並不等於除以2;
C陷阱與缺陷(六)預處理器
第六章 預處理器 1 不能忽視巨集定義中的空格 巨集提供了一種對組成c程式的字元進行變換的方式,而並不作用於程式中的物件 define f x x 1 因為f和後面的 x 之間多了乙個空格,所以f代表 x x 1 注 這一規則不適用於巨集呼叫,只對巨集定義適用 2 巨集並不是函式 巨集定義中每個引數...
C陷阱與缺陷 第五章 庫函式
有關庫函式的使用,最好的建議是盡量使用系統標頭檔案。因為標頭檔案中包括了庫函式的引數型別和返回型別的宣告。5.1 返回整數的getchar的函式 include main getchar函式一般的情況下返回的是標準輸入檔案中的下乙個字元,當沒有輸入時,返回eof。但由於 c 宣告成了char 型別,...
C 主流預處理,編譯和鏈結過程
在c 的程式的編寫過程中,基本上都碰到過lnk2005的錯誤吧,下面就針對這個問題詳細分析 首先,預處理階段 這一過程,主要針對 include和 define進行處理,具體過程如下 對於cpp檔案中經常會出現 include來包含某個標頭檔案,在進行預處理之後,所有的 include命令都將替換成...