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