9
一個經典的宏來計算陣列中的元素的數量是這樣的:有沒有辦法讓countof()來測試它的參數是否是一個數組?
#define countof(a) (sizeof(a)/sizeof(*(a)))
與此問題是它靜靜地失敗,如果參數是一個指向代替陣列。有沒有一種可移植的方式來確保這個宏只與一個實際的數組一起使用?
一個經典的宏來計算陣列中的元素的數量是這樣的:有沒有辦法讓countof()來測試它的參數是否是一個數組?
#define countof(a) (sizeof(a)/sizeof(*(a)))
與此問題是它靜靜地失敗,如果參數是一個指向代替陣列。有沒有一種可移植的方式來確保這個宏只與一個實際的數組一起使用?
使用非便攜的內置功能,這裏是進行靜態斷言a
是一個數組宏:
#define assert_array(a) \
(sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1)
它與兩個gcc
和clang
。我用它來使countof()
宏更安全:
#define countof(a) (sizeof(a)/sizeof(*(a)) + assert_array(a))
但是我沒有這個問題的便攜式解決方案。
編譯時聲明sizeof(&table [0])!= sizeof(table [0]),並且在大多數情況下你將會在那裏,當涉及到多成員結構時。指針的大小也是指向指針的指針的大小。對於結構體來說,這隻能是一個非常簡單的結構體。在大多數情況下,這並不完美,而是接近您的目標。和便攜式。 –
@ B.Nadolson雖然它可能適用於某些特定情況,但我可能會在您使用它的地方發表大量意見(按照最不讓人意外的原則)。有很多情況下,檢查無法正常工作,但程序員可能會認爲它確實如此。 – tangrs
屬性'(intptr_t)&table ==(intptr_t)table'對於一個數組是有效的,如果指針只有指向它自己的時候它才佔用,這很少見。 – Marian