2013-06-30 23 views
1

偶爾,一個讀取舊的C編譯器有這樣的不0(void *)0NULL定義。我的C標準的理解是,即使空指針平臺的位模式爲非零值,整數0轉換爲指針(隱或顯式)仍然是一個空指針,並在內部存儲爲平臺的空指針位模式。在較老的平臺上有什麼其他的NULL定義?

但例如,here上寫着:

在一些較舊的C編譯器,NULL被各種不同的定義一些奇怪的事情,所以你必須要更加小心。

我記得在各種其他地方閱讀這不時。除非這是一個持久的城市傳奇,否則NULL的其他定義已被使用?

+0

我很確定有些系統在C標準之前的惡劣日子裏使用了'0L'。 –

+2

@CarlNorum:我不認爲問題是重複的。另一個人正在研究可怕的不符合定義(至少根據問題中的例子),而這一個可以很好地回答,但符合但不同尋常的定義。 –

回答

0

你是絕對正確的。

你可能遇到的一個「奇怪的事情」是#define'ing NULL到((void *)0),這將導致代碼使用NULL作爲任何東西,但指向失敗。

這裏有一些其它的變化:

http://www.tutorialspoint.com/c_standard_library/c_macro_null.htm

#define NULL ((char *)0)

#define NULL 0L

#define NULL 0

另外值得一提的是,C++ 11引入了nullptr提供NULL,0的類型安全的歧義,等等。參見Much Ado about Nothing,或(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf

+0

並且濫用'NULL'的代碼失敗非常好! –

+0

下面是使用「0」而不是NULL的一些很好的參數:[在舊平臺上有什麼其他的NULL定義?](http://www.gamedev.net/topic/277583-does-null-need-a -header-do-i-mess-something-up /?view = findpost&p = 2727022) – paulsm4

+0

但是,如果有'char c = NULL',產生一個警告比通過uncommented之後讓它更好。 –

1

你是絕對正確的,你是在說空當 - 指針常量(常數積分零或常數積分零點強制轉換爲void *)保證正確轉換爲目標類型的空指針的適當內部表示形式。這意味着不需要NULL的任何其他定義。 0(void *) 0無處不在。

然而,在同一時間,C語言非常早期的版本中並沒有做出這樣的保證並沒有一個標準NULL宏。爲指針變量指定一個整型值會導致指針字面上指向由該整型值表示的地址。分配常數0的指針只是由它指向地址0。如果用戶想要在他們的程序中保留一個指針值,他們必須手動選擇一個「一次性」地址用於此目的。

在語言標準化之前以及上述零到指針轉換規則出現之前,宏NULL很可能已進入非正式使用狀態。那時NULL必須被定義爲表示該確切保留地址的整數值。例如。對於空指針使用地址0xBAADFOOD的預標準C實現將將NULL定義爲0xBAADFOOD。雖然我不能確定,因爲我不知道什麼時候第一個出現在「野外」的確切宏觀NULL

相關問題