簡體   English   中英

如何在C ++中實現no-op宏(或模板)?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM