在C ++中使调试函数无效的更好方法

时间:2015-11-13 02:27:03

标签: c++

我的程序使用了许多#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

然而,也有例外:

  1. 当调试函数具有返回值时,上述策略将不起作用。例如调用该函数的代码可以采用以下格式:bar = foo();
  2. 当调试函数采用类的成员函数形式时,上述策略将无效。
  3. 有什么想法吗?

2 个答案:

答案 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是为发布版本定义的。