6.6 如果 NULL 定義成 #define NULL ((char *)0)  難道不就可以向函數傳入不加轉換的 NULL 了嗎?

一般情況下, 不行。複雜之處在於, 有的機器不同類型數據的指針有不同的內部 表達。這樣的 NULL 定義對於接受字符指針的的函數沒有問題, 但對於其它類型 的指針參數仍然有問題 (在缺少原型的情況下), 而合法的構造如
    FILE *fp = NULL;
則會失敗。

不過, ANSI C 允許 NULL 的可選定義

    #define NULL ((void *)0)
除了潛在地幫助錯誤程序運行 (僅限於使用同樣類型指針的機器, 因此幫助有限) 以外, 這樣的定義還可以發現錯誤使用 NULL 的程序 (例如, 在實際需要使用 ASCII NUL 字符 的地方; 參見問題 5.7)。

無論如何, ANSI 函數原型確保大多數 (儘管不是全部; 參見問題 5.2)指針參 數在傳入函數時正確轉換。 因此, 這個問題有些多餘。

參考資料: [Rationale, Sec. 4.1.5]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)