3

我有许多printfs我想注释掉,并且能够以灵活的方式再次取消注释。我正在考虑这样的解决方案:

#define SOMETHING
...

#ifdef SOMETHING
printf(....
#endif

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

第二个问题,我可以对couts做同样的事情吗?如果不能,他们还有什么解决方案?

4

4 回答 4

6

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

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


void test()
{
    PRINT(("Entering test\n"));
}
于 2013-01-04T17:35:30.297 回答
4

除了Caption Obvlious answer之外,既然您在询问std::cout:是的,这是可能的,但是,因为您将使用<<运算符,您必须提供一个特殊的 nullstream,它只会忽略每个输入:

#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空流。

于 2013-01-04T17:44:00.097 回答
2

选择性地记录事物是许多人面临的问题。与其滚动您自己的解决方案并随着您的需求变化而慢慢扩展它,而是考虑使用现有的实现,例如Boost.Log 它有很多您现在可能不需要但将来很可能需要的功能。

于 2013-01-04T17:37:36.290 回答
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
//'
于 2013-01-04T17:39:46.627 回答