[英]Can I compare a function pointer to a function for equality?
這是有效的C99代碼嗎? (我想我在問它是否可攜帶)
void test(void){
return;
}
void (*fp)(void) = test;
if (fp == test){ <--- This line
printf("Success\n");
}
我只收集可以比較的相同類型的指針,所以也許我的問題是像“ test”這樣的函數名稱是否只是指針別名? 也許有人可以告訴我我的問題比我能做到的更好:)
該代碼是有效的ANSIC。
實際上發生的是,函數名稱(例如代碼中的test
會自動轉換為函數的指針。
您可以將test
更改為&test
,結果是相同的。
是的,很好。 在這種情況下,C標准很容易解釋(C11 6.3.2.1/4):
函數指示符是具有函數類型的表達式。 除非是
sizeof
運算符或一元&
運算符的操作數,否則將類型為“函數返回類型”的函數指定符轉換為具有類型為“函數返回指針的指針”的表達式。
在您的情況下, test
是具有函數類型的表達式。 它被轉換為void(*)(void)
類型的函數指針。 這是與fp
兼容的指針類型,因此==
運算符允許它。
關於相等運算符==
,標准說(C11 6.5.9,重點是):
當且僅當兩個都是空指針,並且兩個指針都是指向同一對象的指針(包括指向對象和位於其開頭的子對象的指針)或函數時 , 兩個指針的比較結果相等 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.