试图创建一个宏,可以用于在定义debug时打印调试消息,就像下面的伪代码:
#define DEBUG 1
#define debug_print(args ...) if (DEBUG) fprintf(stderr, args)
这是如何用宏来完成的呢?
试图创建一个宏,可以用于在定义debug时打印调试消息,就像下面的伪代码:
#define DEBUG 1
#define debug_print(args ...) if (DEBUG) fprintf(stderr, args)
这是如何用宏来完成的呢?
当前回答
如果你不关心输出到stdout,你可以使用这个:
int doDebug = DEBUG; // Where DEBUG may be supplied in compiler command
#define trace if (doDebug) printf
trace("whatever %d, %i\n", arg1, arg2);
其他回答
如果你不关心输出到stdout,你可以使用这个:
int doDebug = DEBUG; // Where DEBUG may be supplied in compiler command
#define trace if (doDebug) printf
trace("whatever %d, %i\n", arg1, arg2);
我会这样做
#ifdef DEBUG
#define debug_print(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
#else
#define debug_print(fmt, ...) do {} while (0)
#endif
我觉得这个比较干净。
我相信这个主题的变化提供了调试类别,而不需要每个类别有一个单独的宏名称。
我在Arduino项目中使用了这个变体,其中程序空间限制为32K,动态内存限制为2K。添加调试语句和跟踪调试字符串很快就会占用空间。因此,在每次构建代码时,必须能够将编译时包含的调试跟踪限制在必要的最低限度。
debug.h
#ifndef DEBUG_H
#define DEBUG_H
#define PRINT(DEBUG_CATEGORY, VALUE) do { if (DEBUG_CATEGORY & DEBUG_MASK) Serial.print(VALUE);} while (0);
#endif
调用.cpp文件
#define DEBUG_MASK 0x06
#include "Debug.h"
...
PRINT(4, "Time out error,\t");
...
下面是我使用的版本:
#ifdef NDEBUG
#define Dprintf(FORMAT, ...) ((void)0)
#define Dputs(MSG) ((void)0)
#else
#define Dprintf(FORMAT, ...) \
fprintf(stderr, "%s() in %s, line %i: " FORMAT "\n", \
__func__, __FILE__, __LINE__, __VA_ARGS__)
#define Dputs(MSG) Dprintf("%s", MSG)
#endif
根据http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html, __VA_ARGS__之前应该有##。
否则,宏#define dbg_print(format,…)printf(format, __VA_ARGS__)将不会编译以下示例:dbg_print("hello world");