我正在寻找一种解决方案来向前声明/定义 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")

有人有这种结构的经验吗?

最佳答案

您需要 _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 )的问题。它需要一个字符串字面量参数,手动构建是非常不切实际的,这就是为什么您几乎总是看到它包含在使用 #(字符串化)运算符构建字符串的宏中的原因,如上面的代码片段所示。

关于c - 前向定义 GCC 的编译指示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56548146/

10-14 12:18