[英]C++ ifdef for repeated lines
我有很多printfs ,我想注釋掉,並能夠以靈活的方式再次取消注釋。 我在想這樣的解決方案:
#define SOMETHING
...
#ifdef SOMETHING
printf(....
#endif
但是一個薄弱的部分是我必須為每個printf做這件事。 第一個問題,有人知道更有效的方法嗎? 如果是這樣,請以一些片段為例,因為對於預處理器和宏定義,我是初學者。
第二個問題,我可以對couts做同樣的事情 ,如果沒有,那么他們也會有什么解決方案呢?
您可以使用一個簡單的宏來完成此操作,該宏允許您完全刪除printf
語句。
#ifdef PRINT_DATA
#define PRINT(x) printf x
#else
#define PRINT(x)
#endif
void test()
{
PRINT(("Entering test\n"));
}
除了Caption Obvlious的回答 ,因為你問的是std::cout
:yes,但是,這是可能的,因為你要使用<<
運算符,你必須提供一個特殊的null流,它只是忽略每個輸入:
#ifdef PRINT_DATA
#define OUT std::cout
#else
#include <iosfwd>
struct nullstream_t{};
template <typename T>
nullstream_t & operator<<(nullstream_t & s, T const &){return s;}
nullstream_t & operator<<(nullstream_t & s, std::ostream &(std::ostream&)){
return s;
}
static nullstream_t nullstream;
#define OUT nullstream
#endif
#include <iostream>
int main(){
OUT << "Hello World" << std::endl;
}
這個想法仍然是一樣的,你定義一個宏,它定義std::cout
或nullstream。
選擇性地記錄事物是許多人面臨的問題; 考慮使用像Boost.Log這樣的現有實現,而不是滾動自己的解決方案並慢慢擴展它。它具有許多您現在可能不需要的功能,但將來可能需要。
關於cout的問題,請問我使用的是什么:
#define verbose
//or
bool verbose = true;
//Verbose Output
#define VOUT(str) do { if (verbose) { std::cout << str; } } while (0,0)
(0,0)
用於避免Visual Studio上的某些編譯器警告。 使用VOUT看起來像這樣:
int i = 5;
VOUT("Hello world " << i << '\n');
//'Hello world 5
//'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.