Требуется оператор предварительной обработки _Pragma
(представлен в C99):
// Definition
#define PRAGMA(...) _Pragma(#__VA_ARGS__)
#if 1 // generate todo list
#define ADD_TODO(msg) PRAGMA( message "[todo]" msg)
#else
#define ADD_TODO(msg) /*empty*/
#endif
// Usage
ADD_TODO("this may result in unitialized variables, fix this")
Оператор решает проблему невозможности использования директив препроцессора (таких как #pragma
) внутри #define
). Он принимает строково-буквальный аргумент, который нецелесообразно создавать вручную, и поэтому вы почти всегда будете видеть его завернутым в макрос, который строит строку с использованием оператора #
(stringification), как показано выше сниппет.