解释C++中的#define PRINTF if(false)PRINTF
Interpreting #define PRINTF if(false) printf in C++
我正在分析C++中的以下宏:
#define PRINTF if(false) printf
这是否意味着,不必键入printf(" .... ");
,只需使用PRINTF("...")
?或者只有当代码中的布尔值为true时,PRINTF
才被激活?
这似乎是为了切换输出
PRINTF("What ever");
在扩展到时永远不会打印任何内容
if(false) printf("What ever");
然后,您可以通过更改来打开输出
#define PRINTF if(false) printf
至
#define PRINTF if(true) printf
#define PRINTF if(false) printf
是PRINTF
的宏,它将用取代后者
if(false) printf
在您的代码中。所以每当你写
PRINTF("something")
它被翻译成
if(false) printf("something")
即不执行。当您可能想要"取消"PRINTF
时,它可能对调试有用。为了保持它显示内容,你只需将宏更改为
#define PRINTF if(true) printf
当您编写时
PRINTF("这没有任何作用");
它将在文本上用取代它
if(false) printf("this does nothing" );
所以基本上它不会有任何作用,因为条件总是错误的。
正如其他人已经告诉你的,这是一种打开和关闭输出的方法
然而,这是一种非常容易出错的方法
考虑以下代码:
#include <stdio.h>
#define PRINTF if(false) printf
int main()
{
bool x = true;
int i = 0;
if (x) {
PRINTF("What ever");
else
i = 1;
}
}
你能猜出i
是什么吗?
答案是它将是1
,因为编译器不关心意外的错误缩进,并且PRINTF
宏扩展如下:
#include <stdio.h>
#define PRINTF if(false) printf
int main()
{
bool x = true;
int i = 0;
if (x) {
if(false) printf("What ever");
else
i = 1;
}
}
更容易理解为:
#include <stdio.h>
#define PRINTF if(false) printf
int main()
{
bool x = true;
int i = 0;
if (x) {
if(false)
printf("What ever");
else
i = 1;
}
}
宏是邪恶的
无论如何,您都应该使用不同的方式来切换输出。事实上,您不应该盲目地关闭"发布"版本中的日志记录消息(这似乎是这个宏的意图),因为这是您以后最需要它们的地方。另一方面,只有最基本的玩具应用程序才应该无条件地使用printf
或std::cout
的直接标准输出。您应该改为对std::ostream
引用进行操作。搜索有关在C++中登录的相关堆栈溢出问题。这个题目相当复杂。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 伪造事实↔false
- QueryWorkingSet总是返回false
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 如何区分地图中的 0 和 false?
- C++ Setter/Getter,cout 工作,printf 失败
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- Arduino-C++ bool 不会从 false 变为 true
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- Printf 命令不打印时添加了查找常见除数的新代码
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 为什么在包含iostream时可以使用printf()?
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 等于在 c++ 中返回 false
- 创建具有验证和语法突出显示的自定义 printf
- 为什么在 c++ 中使用 ios::sync_with_stdio(false) 后在 cout 之前执行 printf
- 使用std::ios::sync_with_stdio(false)可以比scanf和printf更快
- 解释C++中的#define PRINTF if(false)PRINTF