簡體   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