POSIX 要求(我認為)函式指標可以存盤在 void* 型別的變數中和/或傳遞給需要 void* 引數的函式,即使這是嚴格非標準的。
我的問題是:如果我測驗這樣一個變數/引數的NULL-ness,if (!(variable or argument))比如說,結果是true,那是否一定意味著函式指標是NULL?NULL void*資料指標的位模式是否可以等同于非 NULL函式指標值?任何理智的實作都會這樣做嗎?任何常見的實作都這樣做嗎?
編輯:這個答案(誠??然是另一個問題)讓我想知道我是否必須在測驗 NULL-ness 之前將 void* 中間體轉換回原始函式指標型別,否則它是 UB ......這是真的嗎?那些發布答案的人可以對這個問題發表意見嗎?
uj5u.com熱心網友回復:
C 2018 6.3.2.3 4 說:
將空指標轉換為另一種指標型別會產生該型別的空指標。任何兩個空指標比較相等。
與第 7 段不同,本段不限制轉換為指向物件型別的指標或指向函式型別的指標。因此,如果將某個指向函式的指標型別void *的空指標轉換為,則結果為空指標,然后對其應用!產生 1。
相反,如果應用于!指標產生 1,則它必然來自空指標,這更困難。我們可以想象一些非空函式指標,當轉換為 時void *,會產生一個空指標。考慮到 POSIX 允許將函式指標臨時存盤在 中的意圖void *,我們可以得出結論,將指向函式的指標轉換為void *永遠不應導致空指標。
NULL void* 資料指標的位模式是否可以等同于非 NULL 函式指標值?
C 標準不討論用于表示指標的位模式。語意是根據值建立的。
任何理智的實作都會這樣做嗎?
當然,某些硬體上的裸機引導代碼可能會將可執行指令放在地址零并出于某種原因在那里呼叫函式,并且還可能使用地址零作為空指標。它將被簡單地設計為不依賴于地址為零的那個函式,而不是被測驗為空指標。
在這種特殊情況之外,即出于所有實際目的,不會這樣做。如果某些軟體決定它需要一個空指標的特殊表示,它會為此留出一些地址,而不將該地址用于任何普通函式或物件。
uj5u.com熱心網友回復:
該C11 草案標準建議,雖然不是核心標準的一部分,但將函式指標轉換為物件指標(出于測驗目的,如在您的NULL-check 中)屬于“通用擴展”類別(附件 J.5):
J.5.7 函式指標強制轉換
1 指向物件或 to
void的指標可以轉換為指向函式的指標,允許資料作為函式呼叫(6.5.4)。2 指向函式的指標可以轉換為指向物件或指向 的指標
void,從而允許檢查或修改函式(例如,由除錯器)(6.5.4)
uj5u.com熱心網友回復:
如果實作的目標平臺是空代碼指標的通用慣用位模式與空資料指標的通用慣用位模式不同,則可以自由地向程式員公開指標不同的事實,或將指標操作包裝在一個抽象中,使它們的行為相同。該標準的作者沒有試圖猜測哪種方法更有用,因為實際為相關平臺撰寫代碼的人比委員會更能判斷每種方法的利弊。
在目標平臺對兩種空指標使用相同表示的更常見的情況下,標準的作者會期望實作將以這種方式存盤兩種型別的指標,但也會考慮這樣的想法實作應該表現得足夠明顯,以至于不需要花費大量的墨水來推薦這種行為。
該標準沒有強制要求通用行為并不意味著任何實作應該做任何其他事情的判斷,而只是承認可能存在某些其他行為有時比普通行為更有用的實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384357.html
