2012-10-15 37 views
4

在沒有Google幫助的情況下,我想知道是否有人能告訴我是否有可能創建一個C++(g ++)調試宏, 「std :: cout。想法是通過< <接受指定參數和追加一些文本,以便製作一個類似於流的C++宏

DBG << "Hello" << world; 

可能會產生

myfile.cpp 1420 Hello world 

我知道有記錄庫(?)/宏(?),在那裏,這樣做那類的東西。我對它如何完成感興趣,而不是使用一些軟件包。

回答

12

你的宏可以創建一個臨時變量,在銷燬時調用endl。暫時將停留,直到封閉表達式結束,通常在;

#include <iostream> 

struct X { 
    ~X() { std::cout << std::endl; } 
}; 

#define DBG (X(), std::cout << __FILE__ << " " << __LINE__ << " ") 

int main() { 
    std::string world(", world"); 
    DBG << "Hello" << world; 
} 
+0

不錯! http://ideone.com/iZdwz +1 –

6

如何:

#define DBG std::cout << __FILE__ << " " << __LINE__ << " " 

http://ideone.com/mN5n3

足夠關閉!不幸的是,您必須事先聲明變量world

+0

我想我即將用錘子敲打自己...... –

+0

另一個想法是,然後有可能讓宏在< - >字符串後附加「std :: endl」我可以把它放在前面,但是我想要的是比CRLF更多的flush()操作,通常std :: cout和std :: cerr永遠不會把它放到screnn中,直到某些東西其他的刷新輸出 –

+0

@WesMiller我不這麼認爲,至少在這個語法中,它似乎是不可能的 –

1

調試宏背後的想法是,如果您處於發佈模式,它應該編譯爲無。嘗試這個;

#ifdef _DEBUG 
    #define MESSAGE(x) (std::cout << __FILE__ << " " << __LINE__ << " " << x); 
#else 
    #define MESSAGE(x) ; 
#endif 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MESSAGE("Hello"); 
    return 0; 
} 

當你在釋放模式,MESSAGE(x)不會有任何影響,但在調試模式下,你會得到一個消息到命令行。

+0

幹得好!感謝您的洞察力。 –

+0

好吧,再次想到,你仍然是對的,但堅持原始問題的形式,其DBG <<「你好」「世界; - 當_DEBUG未定義時會導致錯誤。目標是使用<<不是DBG(macro_vars)。我想我需要std :: null類似於std :: cout,但這是不正確的,因爲整個混亂不會在發佈模式下編譯出來。 –

+0

唉,如果x中有任何<<,MESSAGE(x)表單將失敗,例如MESSAGE(「Hello」<<「world」;與 類型'const char [6]'和'const char [6]'到二元運算符<<'的無效操作數n 我嘗試添加一些{} –

相關問題