我需要在调试模式下将某些代码行“激活”,并在发布模式下忽略。 有没有办法做这样的事情:
#include <iostream>
using namespace std;
#ifdef _TEST_
#define _cerr cerr
#else
#define _cerr // cerr
#endif
int main() {
_cerr << "TEST message" << endl;
}
因此,当未定义_TEST_
时,会对某些行进行注释或从代码中删除。我知道评论是在其余的之前处理的,所以这段代码是错误的。但是如何在不明确使用#ifdefs的情况下获得我需要的行为?
答案 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;;
}