в то время как обычно #error
является достаточным (и переносимым), бывают случаи, когда вы хотите использовать pragma
, а именно, когда вы хотите дополнительно вызвать ошибку внутри макроса.
Вот пример использования, который зависит от C11 _Generic
и _Pragma
Этот пример гарантирует, что var
не является int *
или short *
, но не const int *
во время компиляции.
Пример:
#define MACRO(var) do { \
(void)_Generic(var, \
int *: 0, \
short *: 0, \
const int *: 0 _Pragma("GCC error \"const not allowed\"")); \
\
MACRO_BODY(var); \
} while (0)