Macro de tamanho de matriz que rejeita ponteiros

A macro de tamanho de matriz padrão frequentemente ensinada é

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

ou alguma formação equivalente. No entanto, esse tipo de coisa ocorre silenciosamente quando um ponteiro é passado e fornece resultados que podem parecer plausíveis em tempo de execução até que as coisas desmoronem misteriosament

É muito fácil cometer este erro: uma função que possui uma variável de matriz local é refatorada, movendo um pouco de manipulação de matriz para uma nova função chamada com a matriz como parâmetr

Então, a questão é: existe uma macro "sanitária" para detectar o uso indevido doARRAYSIZE macro em C, de preferência em tempo de compilação? Em C ++, usamos apenas um modelo especializado apenas para argumentos de matriz; em C, parece que precisamos de alguma maneira de distinguir matrizes e ponteiros. (Se eu quisesse rejeitar matrizes, por exemplo, eu faria, por exemplo,(arr=arr, ...) porque a atribuição da matriz é ilegal

questionAnswers(9)

yourAnswerToTheQuestion