В списке рассылки ядра Linux была обсуждена макрос, проверяющий, является ли его аргумент целочисленным константным выражением и является самим выражением константы.
Один особенно умный подход, который не использует встроенные функции, предложенный Мартином Уекером (взяв вдохновение из glibc tgmath.h):
#define ICE_P(x) (sizeof(int) == sizeof(*(1 ? ((void*)((x) * 0l)) : (int*)1)))
Этот макрос расширяется в целочисленное константное выражение значения 1
, если аргумент представляет собой целочисленное константное выражение, 0
в противном случае. Тем не менее, он полагается на sizeof(void)
для разрешения (и отличается от sizeof(int)
), который является расширением GNU C.
Можно ли написать такой макрос без встроенных функций и не полагаться на языковые расширения? Если да, оценивает ли он свой аргумент?
Для объяснения макроса, показанного выше, см. вместо этого: Объяснить макрос, который проверяет выражение константы целых чисел