如何在发布模式下自动注释行?

时间:2009-11-03 12:38:14

标签: c++ debugging c-preprocessor release release-mode

我需要在调试模式下将某些代码行“激活”,并在发布模式下忽略。 有没有办法做这样的事情:

#include <iostream>
using namespace std;

#ifdef _TEST_
#define _cerr cerr
#else
#define _cerr // cerr
#endif

int main() {
   _cerr << "TEST message" << endl;
}

因此,当未定义_TEST_时,会对某些行进行注释或从代码中删除。我知道评论是在其余的之前处理的,所以这段代码是错误的。但是如何在不明确使用#ifdefs的情况下获得我需要的行为?

10 个答案:

答案 0 :(得分:9)

您可以使用宏:

#ifdef _TEST_
#define DEBUG_ONLY(x) x;
#else
#define DEBUG_ONLY(x)
#endif

int main() {
    DEBUG_ONLY(cerr << "TEST message" << endl)
}

答案 1 :(得分:5)

如果您所使用的是在发布版本中删除的调试日志记录,您可以执行以下操作:

#ifdef _TEST_
#define LOG(x) (cerr << x << endl)
#else
#define LOG(x)
#endif

...

int main() {
    LOG("TEST message");
}

答案 2 :(得分:4)

使用此:

#ifdef _TEST_
#define DEBUG_TEST(x) x
#else
#define DEBUG_TEST(x)
#endif

int main() {
    DEBUG_TEST(_cerr << "TEST message" << endl);
}

答案 3 :(得分:2)

ifdefs是要走的路。如果编译器处于发布与调试模式,你怎么知道?除了预处理阶段之外还会传达什么?在其他阶段,您可以决定删除/添加代码(除了在模板生成期间)。嘿,也许我们可以使用模板生成...但你仍然必须以某种方式关闭ifdef来控制你的模板。

也许有一种非常灵巧的方法可以做到这一点,我没有想到,但每个人都知道/使用ifdef来达到这个目的。如果你抛出一个曲线球,它只会大大增加维护代码的人力成本。

坚持使用ifdefs。

答案 4 :(得分:1)

这基本上可以满足您的要求:

#ifdef _TEST_
#define _cerr  cerr
#else
#define _cerr  if (1) {} else cerr
#endif

但是,如果您在编写类似这样的内容时获得有关模糊else的编译器警告,请不要感到惊讶:

if (something)
  _cerr << "Why?" << std::endl;

你应该始终意识到这个_cerr实际上是一个非平凡的宏。

答案 5 :(得分:1)

将_cerr定义为no将导致编译失败。您可以改为定义在发布模式下排除的宏。

例如:

#ifdef _TEST_
#define LOG_ERROR(log) cerr << log << endl;
#else
#define LOG_ERROR(log) 
#endif

然后在你的代码中:

int main() {
   LOG_ERROR("TEST message");
}

答案 6 :(得分:0)

int main() {
#ifdef _TEST_
   _cerr << "TEST message" << endl;
#endif
}

答案 7 :(得分:0)

没有。绝对没有。

尝试对此进行修改:

#ifdef _TEST_
    ostream& _cerr = cerr;
#else
    ostringstream _cerr;
#endif

(基本上你会想要一个只丢弃其输入的流。)

答案 8 :(得分:0)

“无登录版本”的更好解决方案是以下类:

class NullStream {
   template<typename T> NullStream& operator<< const(T&) { }
};

使用:

#ifdef DEBUG
#define CERR std::cerr
#else
#define CERR NullStream()
#endif

答案 9 :(得分:0)

创建自己的NULL流。

#include <iostream>

class NullStream    {};
template<typename T>
NullStream& operator <<(NullStream& n,T const& data)                        {return n;}
NullStream& operator <<(NullStream& n,std::ostream& (*)(std::ostream&))     {return n;}

#ifdef  _TEST_
#define myerr       std::cerr
#else
NullStream  myerrstream;
#define myerr       myerrstream
#endif

int main()
{
    myerr << "Hi" << std::endl;;
    myerr << std::endl;;
}