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