[英]How do I implement no-op macro (or template) in C++?
如何在C ++中實現no-op宏?
#include <iostream>
#ifdef NOOP
#define conditional_noop(x) what goes here?
#else
#define conditional_noop(x) std::cout << (x)
#endif
int main() {
conditional_noop(123);
}
我希望在定義NOOP時不執行任何操作,並且在未定義NOOP時打印“123”。
雖然留空是顯而易見的選擇,但我會選擇
#define conditional_noop(x) do {} while(0)
這個技巧顯然是無操作,但強迫你在conditional_noop(123)
之后寫一個分號。
如前所述 - 沒有。
此外,您的代碼中存在錯誤打印。
它應該是#else而不是#elif 。 如果它是#elif ,則后面跟着新條件
#include <iostream>
#ifdef NOOP
#define conditional_noop(x) do {} while(0)
#else
#define conditional_noop(x) std::cout << (x)
#endif
玩得開心! 編輯:添加[do]構造的穩健性,如另一個答案所示。
將宏定義為void
可以很好地傳達您的意圖。
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
#ifdef NOOP
#define conditional_noop(x)
#elif
沒有!
#ifdef NOOP
static inline void conditional_noop(int x) { }
#else
static inline void conditional_noop(int x) { std::cout << x; }
#endif
即使未定義NOOP
,使用內聯函數void也可以進行類型檢查。 因此,當未定義NOOP
時,您仍然無法將結構傳遞給該函數或未定義的變量。 這將最終阻止您在打開NOOP
標志時收到編譯器錯誤。
你可以把它留空。 您無需關注#define
。
像其他人說的那樣,留空。
你應該使用的一個技巧是向宏添加(void)0
,強制用戶在它之后添加一個分號:
#ifdef NOOP
#define conditional_noop(x) (void)0
#else
#define conditional_noop(x) std::cout << (x); (void)0
#endif
在C ++中, (void)0
什么都不做。 本文將介紹其他不太好的選項,以及它們背后的基本原理。
由於這是一個宏,你還應該考慮一個例子
if (other_cond)
conditional_noop(123);
為了安全起見,你可以給出一個空洞的陳述
#define conditional_noop(X) {}
對於較舊的C,有時您需要以這種方式定義空狀態(也應該進行優化):
#define conditional_noop(X) do {} while(0)
我認為以前的變種組合是一個很好的解決方案:
#ifdef NOOP
static inline void conditional_noop(int x) do {} while(0)
#else
static inline void conditional_noop(int x) do { std::cout << x; } while(0)
#endif
好處是這兩個代碼只在一個塊內有所不同,這意味着它們對於外部的行為對於解析器來說是完全相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.