包含预处理指令的多行宏语句
Mutiline macro statement that includes pre-processor directives
我试图定义一个宏,其中包括一个预处理器if语句,检查其体中的DEBUG状态。基本上,这是我想要实现的:
选项1
#define MY_MACRO {
#ifdef _DEBUG
MyFunction();
#endif
}
我知道另一种实现如下:
选项2
#ifdef _DEBUG
#define MY_MACRO MyFunction();
#else
#define MY_MACRO
#endif
我有两个问题:
- 上述选项1是否正确实施?如果不是,什么是正确的方式去做?
- 选项2总是这样做的首选方式吗?
是的,选项二就是这样做的方法。正如您可能发现的那样,选项1根本不起作用。您可能应该删除替换中尾随的;
:
#define MY_MACRO MyFunction()
否则,如果有人写:
if (condition)
MY_MACRO;
else
do_something_else();
取代生成:
if (condition)
MyFunction();;
else
do_something_else();
…并且两个分号告诉编译器if
语句终止,后面跟着一个空语句,那么就有一个意外的非法的else
。
根据具体情况,最好是:
#define MY_MACRO() MyFunction()
所以调用代码看起来像:
MY_MACRO();
这更符合函数调用
没有办法将宏扩展到任何类型的预处理器指令,所以选项1就是不起作用。最接近的方法是定义依赖于ifdefs的具有多个定义的宏,正如在选项2中所做的那样。您可以做的一件事是定义一个宏,它只扩展到它的参数或不扩展,具体取决于ifdefs:
#ifdef _DEBUG
#define IF_DEBUG(...) __VA_ARGS__
#else
#define IF_DEBUG(...)
#endif
现在您可以在其他宏中使用这个宏:
#define MY_MACRO IF_DEBUG( MyFunction() )
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 if 语句中处理多个 or 的更优雅的方法是什么
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- libneo4j_client. c++中的预处理语句
- 组织sqlite3 C/ c++预处理语句(避免全局代码混乱)
- 包含预处理指令的多行宏语句
- MySQL连接器中的预处理语句