Форвард-прагма для GCC - PullRequest
3 голосов
/ 11 июня 2019

Я ищу решение для предварительного объявления / определения прагмы для GCC.

Я использую прагмы сообщений в качестве списка задач (#pragma message "do this and that"). Тем не менее, я бы хотел включить / отключить сообщения полностью с помощью конструкции следующим образом:

Внимание, это псевдокод:

// Definition
#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")

Кто-нибудь сталкивался с такими конструкциями?

1 Ответ

5 голосов
/ 11 июня 2019

Требуется оператор предварительной обработки _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), как показано выше сниппет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...