Array-Makro, das Zeiger ablehnt

Das häufig gelernte Standardmakro in Array-Größe lautet

#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))

oder eine äquivalente Formation. Dies gelingt jedoch stillschweigend, wenn ein Zeiger übergeben wird, und liefert Ergebnisse, die zur Laufzeit plausibel erscheinen können, bis die Dinge auf mysteriöse Weise auseinanderfallen.

Es ist allzu einfach, diesen Fehler zu begehen: Eine Funktion mit einer lokalen Array-Variablen wird überarbeitet, wobei ein wenig Array-Manipulation in eine neue Funktion verschoben wird, die mit dem Array als Parameter aufgerufen wird.

So lautet die Frage: Gibt es ein "Sanitär" -Makro, um den Missbrauch des @ zu erkenneARRAYSIZE Makro in C, vorzugsweise zur Kompilierungszeit? In C ++ verwenden wir nur eine Vorlage, die nur für Array-Argumente bestimmt ist. In C brauchen wir anscheinend eine Möglichkeit, Arrays und Zeiger zu unterscheiden. (Wenn ich zum Beispiel Arrays ablehnen wollte, würde ich einfach zum Beispiel(arr=arr, ...) weil die Arrayzuweisung unzulässig ist.

Antworten auf die Frage(9)

Ihre Antwort auf die Frage