在 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 "cancelled" 时,它可能对调试很有用。为了让它显示内容,您只需将宏更改为

#define PRINTF if(true) printf

当你写

PRINTF("this does nothing" );

它将文本替换为

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;
    }
}

Macros are evil!

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