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

Interpreting #define PRINTF if(false) printf in C++

本文关键字:PRINTF false if 解释 中的 #define C++      更新时间:2023-10-16

我正在分析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;
    }
}

宏是邪恶的

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