[英]Interpreting #define PRINTF if(false) printf in C++
我正在分析 C++ 中的以下宏:
#define PRINTF if(false) printf
这是否意味着,而不是键入printf(" .... ");
可以只使用PRINTF("...")
吗? 还是仅当代码中的布尔值为真时才激活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++ 的相关 Stack Overflow 问题。 这个话题相当复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.