Еще один пример коллекции.
#define LENGTHOF(X) ({ \
const size_t length = (sizeof X / (sizeof X[0] ?: 1)); \
typeof(X[0]) (*should_be_an_array)[length] = &X; \
length; })
Плюсы:
- Он работает с обычными массивами, массивами переменной длины, многомерными массивами, массивами нулевого размера structs
- Он генерирует ошибку компиляции (не предупреждение), если вы передаете любой указатель, struct или union
- . Он не зависит от каких-либо функций C11
- It дает вам очень читаемую ошибку
Минусы:
- Это зависит от некоторых расширений gcc: Typeof , Statement Exprs и (если вам это нравится) Условные
- Это зависит от функции C99 VLA
задан Martijn Pieters 18 March 2019 в 11:49
поделиться