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