繁体   English   中英

在 C++ 中解释 #define PRINTF if(false) printf

[英]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;
    }
}

宏是邪恶的!

无论如何,您应该使用不同的方式来切换输出。 事实上,你不应该在“发布”版本中盲目地关闭日志消息(这似乎是这个宏的意图),因为这是你以后最需要它们的地方。 另一方面,只有最基本的玩具应用程序才应该无条件地使用带有printfstd::cout直接标准输出。 您应该改为对std::ostream引用进行操作。 搜索有关登录 C++ 的相关 Stack Overflow 问题。 这个话题相当复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM