C ++ ifdef用于重复行

时间:2013-01-04 17:32:30

标签: c++ macros comments c-preprocessor

我有很多 printfs ,我想要评论,并能够以灵活的方式再次取消注释。我在想这样的解决方案:

#define SOMETHING
...

#ifdef SOMETHING
printf(....
#endif

但是弱点是我必须为每个printf做这件事。 第一个问题,有人知道更有效的方法吗?如果是这样,请以一些片段为例,因为对于预处理器和宏定义,我是初学者。

第二个问题,我可以对 couts 做同样的事情,如果没有,那么他们的解决方案是什么呢?

4 个答案:

答案 0 :(得分:6)

您可以使用一个简单的宏来完成此操作,该宏允许您完全删除printf语句。

#ifdef PRINT_DATA
#define PRINT(x) printf x
#else
#define PRINT(x)
#endif


void test()
{
    PRINT(("Entering test\n"));
}

答案 1 :(得分:4)

Caption Obvlious answer之外,由于您询问的是std::cout:是的,这是可能的,因为您可以使用<<运算符来提供特殊的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或一个零流的宏。

答案 2 :(得分:2)

选择性地记录事物是许多人面临的问题;考虑使用像Boost.Log这样的现有实现,而不是滚动自己的解决方案并慢慢扩展它。它具有您现在可能不需要的大量功能,但将来可能需要。

答案 3 :(得分:1)

关于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
//'