簡體   English   中英

C ++ ifdef用於重復行

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

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