有没有比在C中使用#ifdef更简单的方法?

时间:2009-06-17 18:46:37

标签: c debugging assertions

据我所知,断言是C中的一个宏,据说如果你在编译时使用它但是禁用它,那么就不会有开销(这可能不正确我不知道)。 对我来说问题是,我想要做的是将所有变量传递给我的函数并打印输出,但仅限于我想要启用调试。以下是我到目前为止的情况:

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

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

由于

7 个答案:

答案 0 :(得分:11)

试试这个:

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


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

现在,如果您已定义debugmode,则会获得print语句。否则,它永远不会出现在二进制文件中。

答案 1 :(得分: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);
仅当我激活文件顶部的TRACE()宏时,才会打印

i。工作真的很棒,加上它打印出来的源文件,行和功能。

答案 2 :(得分:1)

if (MY_DEBUG_DEFINE) {
        do_debug_stuff();
}

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

#define MY_DEBUG_DEFINE defined(NDEBUG)

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

答案 3 :(得分:1)

使用不支持它的预处理器获取vararg的解决方法

#define DEBUG

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


int dostuff(int value)
{


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

}

答案 4 :(得分:0)

您可以将PRINTF_IF_DEBUGGING定义为

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

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

答案 5 :(得分: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或函数调用),它们的代码可能会生成(但不会被执行)

答案 6 :(得分:0)

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

printf("%s:%d {a=%i, b=%i}\n", __FILE__, __LINE__, a, b);