Макрос размером с массив, который отклоняет указатели

Стандартный макрос размера массива, которому часто учат, это

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

или какое-то эквивалентное образование. Тем не менее, подобные вещи молча успешно выполняются, когда передается указатель, и дают результаты, которые могут казаться правдоподобными во время выполнения, пока вещи не загадочно развалитс

Слишком легко сделать эту ошибку: функция, имеющая локальную переменную массива, подвергается рефакторингу, перемещая часть манипуляций с массивом в новую функцию, вызываемую массивом в качестве параметра.

Так вот, вопрос: есть ли «санитарный» макрос для обнаружения неправильного использованияARRAYSIZE макрос в C, желательно во время компиляции? В C ++ мы бы просто использовали шаблон, специализированный только для аргументов массива; в Си, похоже, нам понадобится какой-то способ различать массивы и указатели. (Если бы я хотел отклонить массивы, например, я бы просто сделал, например,(arr=arr, ...) потому что присвоение массива недопустимо).

Ответы на вопрос(9)

Ваш ответ на вопрос