Closed. This question is
opinion-based。它当前不接受答案。
想要改善这个问题吗?更新问题,以便
editing this post用事实和引用来回答。
在8个月前关闭。
Improve this question
我正在与一位高级C++开发人员一起工作。在他的大多数代码中,他包括调试部分。看起来像这样:
void do_something() {
int var = 10
#ifndef NODEBUG
trace("Function Start %s", __FUNCTION__);
#endif
while (someCondition) {
var += 1
#ifndef NODEBUG
trace ("Var = %d \n", var)
#endif
}
... (Do some other stuff)
... (Do some more stuff)
#ifndef NODEBUG
trace("Function End %s", __FUNCTION__);
#endif
}
我没有他那么有经验,但是这些代码片段遍及整个代码,这确实阻塞了可读性和可理解性。在我看来,预处理程序的条件应至少与其余代码一起正确使用。
这是我应该养成的习惯吗?我不确定这是否是一个好方法,但是我认为这会使代码过分膨胀,应该将其排除在外。
在调试部分中添加代码通常不是一个坏习惯。
只要这段代码不会从根本上改变函数的行为,就不会增加太多复杂性,并且可以为您提供有用的信息。但是,它的确会降低可读性。
真正需要一个仅在调试版本上运行的专用代码段是非常罕见的。我非常通常自己做的是创建专门的宏,这些宏仅对调试版本执行操作。最终变得更加简洁和易读。例如:
// defined in some utility header
#ifndef NODEBUG
#define DEBUG_TRACE(...) trace(__VA_ARGS__)
#else
#define DEBUG_TRACE(...)
#endif
void do_something() {
int var = 10
DEBUG_TRACE("Function Start %s", __FUNCTION__);
while (someCondition) {
var += 1
DEBUG_TRACE("Var = %d \n", var);
}
// ... (Do some other stuff)
// ... (Do some more stuff)
DEBUG_TRACE("Function End %s", __FUNCTION__);
}
如果您现在要添加
#ifndef NODEBUG
代码部分,那么很明显,您正在更改函数的行为而不是仅记录某些内容。
这种做法不仅可以应用于日志记录,还可以应用于断言和仅在调试版本中编译的其他内容。如果您经常这样做,那么以下宏也可能会有所帮助:
#ifndef NODEBUG
#define IF_DEBUG_ELSE(expr, alt) expr
#define IF_DEBUG(...) __VA_ARGS__
#else
#define IF_DEBUG_ELSE(expr, alt) alt
#define IF_DEBUG(...)
#endif
void example(int x) {
IF_DEBUG_ELSE(/* action on debug builds */, /* action on release builds */);
IF_DEBUG(/* one-liner action only on debug builds */);
}
我是一名优秀的程序员,十分优秀!