据我所知,断言是C中的一个宏,据说如果你在编译时使用它但是禁用它,那么就不会有开销(这可能不正确我不知道)。 对我来说问题是,我想要做的是将所有变量传递给我的函数并打印输出,但仅限于我想要启用调试。以下是我到目前为止的情况:
int exampleFunction (int a, int b)
{
#ifdef debugmode
printf("a = %i, b = %i", a, b);
#endif
}
我想知道是否有更容易(而且不那么丑陋)的方法来做这样的事情。 xdebug for php有这个功能,我发现在调试时节省了大量的时间,所以我想为每个功能做这个。
由于
答案 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);