C statische Array-Größe finden (Fehler vermeiden) [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Array-Makro, das Zeiger ablehnt 9 answers

Ermitteln der Größe eines statischen Arrays ist eine häufige Operation. sehen:C statische Arraygröße finden - sizeof(a) / sizeof((a)[0])

Dies kann in ein Makro eingebunden werden, zB:

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

s ist jedoch möglich, versehentlich einen regulären Zeiger einzugebe

z.B:void func(SomeArray **foo) { int i = ARRAY_SIZE(foo); }

Während sein gültiges C, wird es jedoch häufig zu einem logischen Fehler.

Ist möglich, diesen Fehler zu verhindern (Ausnutzen des prozessorbezogenen Fehlers in einem Bitfeld der Länge Null).

#define ARRAY_SIZE(a) \
    ((sizeof(struct { int isnt_array : \
     ((const void *)&(a) == &(a)[0]); }) * 0) + \
     (sizeof(a) / sizeof(*(a))))

Ich habe festgestellt, dass dieses Makro mit GCC funktioniert, bei Clang jedoch nicht, wenn indirekt auf Mitglieder verwiesen wird. miterror: expression is not an integer constant expression

z.B

char word[8]; int i = ARRAY_SIZE(word); in Ordnungstruct Bar { word[8]; }
void func(struct Bar *foo) { int i = ARRAY_SIZE(foo->word); } schlägt fehl.

Gibt es eine tragbarere Möglichkeit, dies umzusetzen? (Die Arbeit mit Clang ist natürlich gut, obwohl ich an allgemeiner Portabilität interessiert bin ... auch andere Compiler).

Dies scheint eine so häufige Aufgabe zu sein, dass es gut wäre, ein wiederverwendbares tragbares Makro zu haben.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage