我顯示了一些我明白的代碼。爲什麼用圓括號包圍函數?
以下代碼是示例代碼。
static void (_func)(int p);
int main()
{
....
_func(3);
....
}
static void (_func)(int p)
{
....
}
一般來說,我知道,功能與括號括起來一起使用「*」的函數指針爲(* _func),但上面的代碼爲什麼環繞帶括號的函數在函數聲明?
有沒有理由使用這種方法?
我顯示了一些我明白的代碼。爲什麼用圓括號包圍函數?
以下代碼是示例代碼。
static void (_func)(int p);
int main()
{
....
_func(3);
....
}
static void (_func)(int p)
{
....
}
一般來說,我知道,功能與括號括起來一起使用「*」的函數指針爲(* _func),但上面的代碼爲什麼環繞帶括號的函數在函數聲明?
有沒有理由使用這種方法?
將parens放在函數名稱周圍可以防止它被同名的函數宏所「覆蓋」。
例如,有時函數可能被實現爲一個宏,但它也可能需要被實現爲一個實際的函數(其中一個原因可能是爲了獲得一個指針)。此API的實現者可能會將函數名稱和實際函數實現的聲明與包裝在parens中的名稱放在一起,以避免與宏名稱發生衝突。
然後,API的用戶可以決定,如果出於某種原因他們想要使用實際的函數而不是宏,他們可以使用#undef _func
或使用包裝在parens中的函數名稱來避免使用宏。
如C99 7.1.4中提到「使用的庫函數」:
在報頭中聲明的任何功能可以被附加地實現爲在報頭中定義的 函數宏,因此,如果一個庫函數 包含其標題時明確聲明,可以使用下面顯示的技術 之一來確保聲明不受 這樣的宏的影響。因爲 名稱後面沒有跟着左括號,表示 擴展了宏函數名稱,所以函數的任何宏定義都可以通過將括號中的函數名稱封裝在本地,從而被局部地抑制 。出於同樣的句法原因,即使 也被定義爲宏,它也允許獲取庫函數的地址。使用#undef刪除任何宏定義也將確保引用實際功能。
我明白英語不是你的第一語言,但你應該考慮學習正確的單詞。這些符號:'()'被稱爲「括號」。 –
感謝Jonathon Reinhart讓我知道與括號相關的正確單詞。對於多於一個()和「括號」,只有一個()的圓括號「 – user2503838
」 – 0decimal0