[英]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.