BUILD_BUG_ON_ZERO
используется в коде ядра как утверждение во время компиляции. По сути, он будет проверять, может ли компилятор вычислить аргумент макроса в 0 (во время компиляции) или не выполнить сборку в противном случае.
/*
* Force a compilation error if condition is true, but also produce a
* result (of value 0 and type int), so the expression can be used
* e.g. in a structure initializer (or where-ever else comma expressions
* aren't permitted).
*/
#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))
Но, как указывает комментарий, он имеет своего рода двойное назначение его также можно использовать как выражение C, например:
#define HWEIGHT64(w) (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_hweight64(w))
Путем поиска по всему коду ядра вы можете обнаружить, что он обычно используется вместе с другими конструкциями, такими как встроенная __builtin_constant_p
или __is_constexpr
.