Чтобы проверить, что размер передаваемого массива (не указателя) составляет не менее 5 элементов, можно использовать Static_assert
, а необходимые _Static_assert
можно вставить через макрос препроцессора.
После объявления функции вставьте:
#define test_array(arr) \
do \
{ \
_Static_assert(sizeof (arr) / sizeof *(arr) >= 5, "Array is too small."); \
test_array(arr); \
} while (0)
(do … while (0)
- это классический способ определения макроса для синтаксического действия как оператора, так что за ним может следовать ;
и выполняйте, как ожидается, с if
операторами и т. д.)
Перед определением функции вставьте:
#undef test_array
(Если последует какое-либо дальнейшее использование функции, еще одна копия#define
должен быть вставлен. В качестве альтернативы, функция может быть определена раньше в исходном файле, после чего следует #define
, что устраняет необходимость в дополнительных директивах #undef
или #define
.)
Обычнотакой код вряд ли будет полезен, поскольку программы часто передают указатели на первые элементы массивов (или на элементы в середине массивов), и невозможно проверить, сколько элементов находится в пространствеуказатель указывает на.Так что это полезно только в коде, где нам требуется массив, который будет задан в качестве аргумента.И это требование не выполняется этим кодом.