Открыл ответы к
викторине.
Комментировать что-то ужасно лень, спать хочется. Под катом варианты мой и Дена, который я написал до того, как задал вопрос. На самые лучшие не претендуют.
Мой:
#define BUILD_BUG_ON(condition) sizeof(char[1 - 2*!!(condition)])
#define BBO_TMPVAR2(x,y) x##y
#define BBO_TMPVAR1(x,y) BBO_TMPVAR2(x,y)
#define BBO_TMPVAR \
BBO_TMPVAR1(static int __attribute__ ((unused)) __bbo_tmp_, \
__COUNTER__)
#define KIR_BBO(condition) BBO_TMPVAR = (BUILD_BUG_ON(condition))
Примечание: __COUNTER__ впроде как есть в gcc, icc и в майкрософтовских реализациях С.
Дена:
#define DEN_BBO(condition) extern void xxx(char[1 - 2*!!(condition)])
А главное, выяснилось, что компилятору всё равно, сколько раз мы объявляем внешнюю переменную или прототип функции, поэтому подпрыгивания с __LINE__ или __COUNTER__ не нужны.