出于调试目的,我想要一个printf_debug函数,它的功能就像标准的printf函数一样,但只有在#DEFINE DEBUG为真时才会打印
我知道我必须使用varagrs(...),但我不知道如何实现它。
提前致谢。
答案 0 :(得分:9)
更容易#define它。像这样:
#ifdef DEBUG
#define printf_debug printf
#else
#define printf_debug while(0)printf
#endif
答案 1 :(得分:2)
我不知道你想要达到的目标。如果您希望仅在定义DEBUG
时执行代码块,请使用预处理程序指令#ifdef
。
#include <stdio.h>
#include <stdarg.h>
#define DEBUG
void printf_debug(const char *format, ...) {
#ifdef DEBUG
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
#endif /* DEBUG */
}
答案 2 :(得分:2)
您不需要使用vargs,宏将起作用。这是一个例子,它也会打印功能和行号:
#ifdef DEBUG
#define printf_debug(fmt, args...) printf("%s[%d]: "fmt, __FUNCTION__, __LINE__, ##args)
#else
#define printf_debug(fmt, args...)
#endif
这里的## args将被args列表取代,它与函数调用中的vargs一样。
答案 3 :(得分:0)
您必须使用va_arg宏,它们用于访问可变参数变量。一个有用的链接:http://www.cppreference.com/wiki/c/other/va_arg。引用是针对C ++的,但这些宏也可以在C中使用。
在实际实现中,使用#ifdef
块中的可变参数放置代码。
但是,如果您正在寻找对printf的常规调用,则依赖于DEBUG
,作为别名的简单#define
将会执行。
答案 4 :(得分:0)
仅限C99编译器!
#include <stdio.h>
#define DEBUG
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__)
#else
#define debug while(0)
#endif
int main(int argc, char *argv[])
{
debug("Only shows when DEBUG is defined!\n");
return 0;
}
老实说,不需要varidic宏,你可以轻松地把它写成:
#include <stdio.h>
#define DEBUG
#ifdef DEBUG
#define debug printf
#else
#define debug while(0)
#endif
int main(int argc, char *argv[])
{
debug("Only shows when DEBUG is defined!\n");
return 0;
}
考虑到这一点,调试信息应该发送到stderr以免干扰stdout,所以这个应该受到青睐:
#include <stdio.h>
#define DEBUG
#ifdef DEBUG
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define debug while(0)
#endif
int main(int argc, char *argv[])
{
debug("Only shows when DEBUG is defined!\n");
return 0;
}