2011-08-17 82 views
2

我需要一個宏來擴展爲C++註釋,這可能嗎?C++宏無空格

我有這樣的:

#define SLASH(x,y) x y 
#define OUT SLASH(/,/) 

int main(int argc, char *argv[]) 
{ 
    OUT << "text"; 
    return 0; 
} 

,需要擴展成:

{ 
    // << "text"; 
    return 0; 
} 

我也試過這樣:

#define SLASH(x) /x 
#define OUT SLASH(/) 

但結果仍是相同:

int main(int argc, char *argv[]) 
{ 
// << "text"; 
    return 0; 
} 
+3

你想要做什麼?你爲什麼需要這個? –

回答

1

正如其他人所說,沒有保證的方式來定義你正在尋找的宏的類型。實現類似於您似乎試圖實現的結果的其他方法是將輸出語句包裝在條件塊中,或者定義一個只丟棄所有輸出的自定義輸出流。這兩種方法甚至可以合併,以便通過更改單個宏定義來切換行爲。

+0

謝謝你的提示:)。我這樣做:#define OUT if(0)qDebug() – Samuel

+0

這將以典型的宏觀方式打破。考慮「如果(x)OUT <<」測試通過「;否則退出(0);」 。如果測試通過而不是打印某些東西,現在總是會退出。 – dascandy

+0

你可以通過「#define OUT if(1)true; else qDebug()」以'聰明'的方式解決這個問題。不知道它會是可靠的或任何東西,但至少你已經擺脫了其他懸掛。 – dascandy

5

不,這是不可能的,因爲在擴展宏之前C++註釋已被刪除。

(參見標準的2.1,註釋去除發生在階段3中,宏擴展在階段4)

+0

查看我的回答 –

+0

謝謝,你真的幫了我: – Samuel

1

評論從預處理器運行前的源代碼移除。所以你不能這樣做。

+0

查看我的回答 –

+0

@LuchianGrigore:你說的「它有效」是什麼意思? –

+0

宏後面的行看起來像一條評論... –

2

那麼用一個不做任何事情的函數對象替換它呢?

static class NullOutput { 
public: 
    template <typename T> 
    const NullOutput &operator<<(T arg) const { 
     return *this; 
    } 
} NullOutputObj; 

#define OUT NullOutputObj 

最終的結果是,對象從代碼中刪除,並通過內聯模板的擴展,這是再優化掉了,因爲他們什麼都不做替換。結果是絕對沒有代碼開銷。

0

備用到要實現將是這樣的:

http://donjaffer.blogspot.in/2012/09/dprintf-debug-macro-in-c.html

#define DEBUG // comment if you do not want the debug statments to appear. 

#ifdef DEBUG 
#define DPRINTF(fmt, ...) \ 
    do { printf("my_file: " fmt, ## __VA_ARGS__); } while (0) 
#else 
#define DPRINTF(fmt, ...) \ 
    do { } while (0) 
#endif 

無論你正在試圖代替COUT < <打印語句,你可以使用

DPRINTF("Your text here\n");