前定义GCC的实用性

aph*_*rdt 3 c macros

我正在寻找一种解决方案,以预先声明/定义GCC的实用程序。

我将消息编译指示用作待办事项列表(#pragma消息“执行此操作”)。但是,我希望通过以下构造完全启用/禁用消息的选项:

警告,这是伪代码:

// 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")
Run Code Online (Sandbox Code Playgroud)

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

PSk*_*cik 5

您需要_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")
Run Code Online (Sandbox Code Playgroud)

操作者解决了不能够使用预处理器指令(如问题#pragma)内的#define)。它需要一个字符串字面量的参数,手工构造它是不切实际的,这就是为什么您总是会看到它被包裹在宏中的原因,该宏使用#(stringification)运算符构造了字符串,如上面的片段所示。