Macro de tamaño de matriz que rechaza los punteros

La macro de tamaño de matriz estándar que a menudo se enseña es

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

o alguna formación equivalente. Sin embargo, este tipo de cosas tiene éxito silenciosamente cuando se pasa un puntero y da resultados que pueden parecer plausibles en el tiempo de ejecución hasta que las cosas se desmoronen misteriosamente.

Es demasiado fácil cometer este error: una función que tiene una variable de matriz local se refactoriza, moviendo un poco de manipulación de matriz a una nueva función llamada con la matriz como parámetro.

ntonces, la pregunta es: ¿hay una macro "sanitaria" para detectar el mal uso de laARRAYSIZE macro en C, preferiblemente en tiempo de compilación? En C ++ solo usaríamos una plantilla especializada solo para argumentos de matriz; en C, parece que necesitaremos alguna forma de distinguir matrices y punteros. (Si quisiera rechazar matrices, por ejemplo, simplemente haría, por ejemplo,(arr=arr, ...) porque la asignación de matriz es ilegal).

Respuestas a la pregunta(9)

Su respuesta a la pregunta