Макрос размером с массив, который отклоняет указатели
Стандартный макрос размера массива, которому часто учат, это
#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
или какое-то эквивалентное образование. Тем не менее, подобные вещи молча успешно выполняются, когда передается указатель, и дают результаты, которые могут казаться правдоподобными во время выполнения, пока вещи не загадочно развалитс
Слишком легко сделать эту ошибку: функция, имеющая локальную переменную массива, подвергается рефакторингу, перемещая часть манипуляций с массивом в новую функцию, вызываемую массивом в качестве параметра.
Так вот, вопрос: есть ли «санитарный» макрос для обнаружения неправильного использованияARRAYSIZE
макрос в C, желательно во время компиляции? В C ++ мы бы просто использовали шаблон, специализированный только для аргументов массива; в Си, похоже, нам понадобится какой-то способ различать массивы и указатели. (Если бы я хотел отклонить массивы, например, я бы просто сделал, например,(arr=arr, ...)
потому что присвоение массива недопустимо).