1

据我了解,assert 是 C 语言中的一个宏,如果您在编译时使用它但将其禁用,则不会有开销(我不知道这可能不正确)。对我来说,问题是我想做的是将所有变量传递给我的函数并打印出该输出,但前提是我希望启用调试。这是我到目前为止所拥有的:

int exampleFunction (int a, int b)
{
  #ifdef debugmode
  printf("a = %i, b = %i", a, b);
  #endif 
}

我想知道是否有任何更简单(且不那么丑陋)的方法来做这样的事情。xdebug for php 有这个功能,我发现它在调试时为我节省了大量时间,所以我想为每个函数都这样做。

谢谢

4

7 回答 7

11

试试这个:

#ifdef debugmode
#define DEBUG(cmd) cmd
#else
#define DEBUG(cmd)
#endif


DEBUG(printf("a = %i, b = %i", a, b));

现在,如果你已经debugmode定义,你会得到你的打印语句。否则,它永远不会出现在二进制文件中。

于 2009-06-17T18:50:17.177 回答
3

使用 GCC,我真的很喜欢添加每个文件:

#if 0
#define TRACE(pattern,args...)   fprintf(stderr,"%s:%s/%u" pattern "\n",__FILE__,__FUNCTION__,__LINE__,##args)
#else
#define TRACE(dummy,args...)
#endif

然后在代码中:

i++;
TRACE("i=%d",i);

i只有当我激活文件顶部的 TRACE() 宏时才会打印。效果非常好,而且它会打印它发生的源文件、行和函数。

于 2009-06-17T19:01:59.123 回答
1
if (MY_DEBUG_DEFINE) {
        do_debug_stuff();
}

任何半体面的编译器都会优化该块。请注意,您需要定义MY_DEBUG_DEFINE为布尔值(即 0 或非 0)。

#define MY_DEBUG_DEFINE defined(NDEBUG)

如果您碰巧以最大警告级别进行编译,则此技巧可避免未引用的参数

于 2009-06-17T18:55:55.640 回答
1

使用不支持它的预处理器获取可变参数的解决方法

#define DEBUG

#ifdef DEBUG
#define trace(args) printf args
#else
#define trace(args)
#endif


int dostuff(int value)
{


    trace(("%d", value));

}
于 2009-06-17T19:17:42.043 回答
0

您可以将 PRINTF_IF_DEBUGGING 定义为

#ifndef NDEBUG
#define PRINTF_IF_DEBUGGING(X) printf(X)
#else
#define PRINTF_IF_DEBUGGING(X)
#endif

这会将#ifdefs 集中在一个地方。

于 2009-06-17T18:51:31.607 回答
0

好吧,这里给出的 PRINT_DEBUG 类型宏的问题在于它们只允许一个参数。对于正确的 printf(),我们需要几个,但 C 宏(目前)不允许可变参数。

因此,要实现这一目标,我们必须发挥创造力。

#ifdef debugmode
     #define PRINTF   printf
#else
     #define PRINTF    1 ? NULL : printf
#endif

然后,当您在非调试模式下编写时PRINTF("a = %i, b = %i", a, b);,它将(有效地)呈现为:

 if (true) NULL;
 else printf("a = %i, b = %i", a, b);

编译器很高兴,但 printf 永远不会执行,如果编译器很亮(即任何现代 C 编译器),将永远不会生成 printf() 的代码,因为编译器将认识到永远无法采用路径.

但是请注意,参数仍将被评估,因此如果它们有任何副作用(即 ++x 或函数调用),它们的代码可能会生成(但不会执行)

于 2009-06-17T19:04:23.940 回答
0

我还会打印一些其他 C 预处理器标志,它们可以帮助您跟踪问题

printf("%s:%d {a=%i, b=%i}\n", __FILE__, __LINE__, a, b);
于 2009-07-17T15:45:50.283 回答