c陷阱和缺陷——鏈接、預處理、庫函數、可移植性缺陷

1.鏈接

1.命名衝突和static修飾符:
如果若干個函數需要共享一組外部對象,可以將這些函數放到一個源文件中,把它們需要用到的對象都在同一個源文件中以static修飾。static同時也適合函數,如果函數g被函數h調用,則將函數g和h放到同一個文件中,並且申明g是static。

2.庫函數

1.一個看似正確的程序:
#include <iostream>
using namespace std;

int main()
{
	char c;
	while ((c=getchar())!=EOF)
	{
		putchar(c);
	}
	
	return 0;
}
這個程序意思很明白:輸入字符不是結束符就把它放到c裏。但實際上卻會因爲可能char類型的c無法裝載EOF整個數據,或者是數據中間部分可能被截斷而出現錯誤。

3.預處理器

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;

4.可移植性缺陷

1.有符號的奇數進行右移位運算時並不是簡單的除以2,且結果也並不等於除以2;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章