build bug on

Jul 23, 2010 16:47

Открыл ответы к викторине.

Комментировать что-то ужасно лень, спать хочется. Под катом варианты мой и Дена, который я написал до того, как задал вопрос. На самые лучшие не претендуют.

Мой:

#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__ не нужны.

fun, programming, c

Previous post Next post
Up