Wir hatten beide Recht.
Um euch beim ARRAYSIZE Makro zu korrigieren:
Wie ich bereits sagte, es ist nicht einfach als sizeof(array)/sizeof(array[0]) definiert, deshalb gibt es keine Rechenfehler bei Pointern, die man diesem Makro übergibt.
Stattdessen wirft es einen Compiler-Fehler, da er die größe des Arrays nicht herausfinden kann.
M2S du hattest insofern Recht, dass es bei Parametern nicht möglich ist, da kommt dann wirklich die Meldung, er könne die Größe nicht von char [] herleiten, genau wie bei char * (habs mit char Arrays getestet). Bei statisch deklarierten Arrays wiederum funktioniert es. Das gilt aber für jegliche Arten von Arrays als Parametern, selbst, wenn man die größe explizit mit char param[42] angibt, kann er sie nicht herleiten (da musste ich den Umweg gehen und eine lokale Variable erstellen und den Inhalt aus dem Parameter kopieren).
Bei lokalen/globalen Variablen funktioniert es wie erwartet mit beiden Varianten, char var[42] oder auch char var[], wobei bei letzterem ja dann die Größe automatisch erkannt wird.
Übrigens ist das ganze keine Eigenart von VS, sondern ein wohldefiniertes Verhalten des ARRAYSIZE Makros, welches im WinDDK definiert ist.
Genauer gesagt gibt es 2 Varianten, eine Version für C und eine für C++. Erstere verhält sich so, wie ihr es bereits gesagt habt, zweitere ist folgendermaßen definiert:
Code:
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))