我的程序使用了许多#ifdef _DEBUG_ ... #endif
块,以取消发布版本的调试功能。
然而,它会阻塞代码,并使代码难以阅读。
还有更好的方法吗?
我能想到的一种方法是通过定义要清空的函数来使其无效,例如:
#ifdef _DEBUG_
void foo(int bar)
{
do_somthing();
}
#else
#define foo(a) do {; } while(0)
#endif
这样我们只有一个#ifdef _DEBUG_ ... #endif
。调用foo()
的所有地方,我们都不必添加#ifdef _DEBUG_ ... #endif
。
然而,也有例外:
bar = foo();
有什么想法吗?
答案 0 :(得分:3)
如何将#ifdef移动到函数本身?即。
// In a .h file somewhere...
inline int foo(int bar)
{
#ifdef DEBUG
return do_something();
#else
(void) bar; // this is only here to prevent a compiler warning
return 1; // or whatever trivial value should be returned when not debugging
#endif
}
...只要函数可以内联(即只要函数体在头文件中),编译器就会在非DEBUG情况下将它全部优化掉,所以不应该这样做通过这种方式执行非调试构建中的任何额外开销。
答案 1 :(得分:0)
如果功能太大而无法正常内联,Jeremy的解决方案将无法正常工作,您仍然需要这两个定义。
// In .h file
#ifndef NDEBUG
int foo(int bar); // Definition in .cpp file
#else
inline int foo(int) {
return 42;
}
#endif
请注意,按assert
约定,NDEBUG
是为发布版本定义的。