В кодовой базе, которая может быть построена как C или C ++, я подумал, что сделаю макрос, использующий преимущества static_assert
в случае, если он построен как C ++ 11 или выше.
(Примечание: я знаю, есть способы сделать это до C11 C , по крайней мере, если вы хотите принять параметр сообщения - хотя он не будет работать везде.в качестве аргумента, скажем, у меня есть законная необходимость сделать так, чтобы оно не принимало сообщений и не использовалось, по крайней мере, в некоторых сборках C.)
Итак, вот простое определение, которое я попробовал:
#if defined(__cplusplus) && __cplusplus >= 201103L
#define STATIC_ASSERT(cond) \
static_assert((cond), #cond)
#else
#define STATIC_ASSERT(cond)
#endif
В макросе нет точки с запятой с намерением добавить его на месте вызова.Но в педантичных настройках предупреждений C этот макрос, появляющийся в глобальной области видимости, вызывает:
ошибка: ISO C не допускает дополнительного ';'за пределами функции [-Werror = pedantic]
Простое решение, по-видимому, состоит в том, чтобы убрать точку с запятой с сайтов вызовов и поместить ее в сторону макроса на C ++ 11.Но мне интересно: как сделать макрос в режиме без операции в глобальной области видимости, который позволяет использовать точку с запятой на месте вызова (без какого-либо другого предупреждения)?