在沒有Google幫助的情況下,我想知道是否有人能告訴我是否有可能創建一個C++(g ++)調試宏, 「std :: cout。想法是通過< <接受指定參數和追加一些文本,以便製作一個類似於流的C++宏
DBG << "Hello" << world;
可能會產生
myfile.cpp 1420 Hello world
我知道有記錄庫(?)/宏(?),在那裏,這樣做那類的東西。我對它如何完成感興趣,而不是使用一些軟件包。
在沒有Google幫助的情況下,我想知道是否有人能告訴我是否有可能創建一個C++(g ++)調試宏, 「std :: cout。想法是通過< <接受指定參數和追加一些文本,以便製作一個類似於流的C++宏
DBG << "Hello" << world;
可能會產生
myfile.cpp 1420 Hello world
我知道有記錄庫(?)/宏(?),在那裏,這樣做那類的東西。我對它如何完成感興趣,而不是使用一些軟件包。
你的宏可以創建一個臨時變量,在銷燬時調用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;
}
如何:
#define DBG std::cout << __FILE__ << " " << __LINE__ << " "
足夠關閉!不幸的是,您必須事先聲明變量world
。
我想我即將用錘子敲打自己...... –
另一個想法是,然後有可能讓宏在< - >字符串後附加「std :: endl」我可以把它放在前面,但是我想要的是比CRLF更多的flush()操作,通常std :: cout和std :: cerr永遠不會把它放到screnn中,直到某些東西其他的刷新輸出 –
@WesMiller我不這麼認爲,至少在這個語法中,它似乎是不可能的 –
調試宏背後的想法是,如果您處於發佈模式,它應該編譯爲無。嘗試這個;
#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)
不會有任何影響,但在調試模式下,你會得到一個消息到命令行。
幹得好!感謝您的洞察力。 –
好吧,再次想到,你仍然是對的,但堅持原始問題的形式,其DBG <<「你好」「世界; - 當_DEBUG未定義時會導致錯誤。目標是使用<<不是DBG(macro_vars)。我想我需要std :: null類似於std :: cout,但這是不正確的,因爲整個混亂不會在發佈模式下編譯出來。 –
唉,如果x中有任何<<,MESSAGE(x)表單將失敗,例如MESSAGE(「Hello」<<「world」;與 類型'const char [6]'和'const char [6]'到二元運算符<<'的無效操作數n 我嘗試添加一些{} –
不錯! http://ideone.com/iZdwz +1 –