【发布时间】:2011-03-19 03:20:18
【问题描述】:
这是我的宏示例:
#define STR(val) #val
#define STRX(val) STR(val)
#define LINE_ STRX(__LINE__)
#define SRC_STR __FILE__":"LINE_
#define SRC_STRN SRC_STR"\n"
#define PRINT_IF(cond) ((cond)&&(printf("\""#cond"\" is true: "SRC_STRN)>=0))
#define PRINT_IFNOT(cond) ((!(cond))&&(printf("\""#cond"\" is false: "SRC_STRN)>=0))
#define PRINT_IFN PRINT_IFNOT
#define PRINT_IFEQ(a,b) PRINT_IF(a==b)
#define PRINT_FMT(val,fmt) printf(#val" = "#fmt": "SRC_STRN,val)
#define PRINT_INT(i) PRINT_FMT(i,%d)
#define PRINT_LONG(i) PRINT_FMT(i,%ld)
#define PRINT_UINT(i) PRINT_FMT(i,%u)
#define PRINT_ULONG(i) PRINT_FMT(i,%lu)
#define PRINT_HEX(i) PRINT_FMT(i,%x)
#define PRINT_FLT(flt) PRINT_FMT(flt,%g)
#define PRINT_PTR(ptr) PRINT_FMT(ptr,%p)
#define PRINT_STR(str) PRINT_FMT(str,%s)
我想定义另一个与此相关的宏列表,但我想避免输入所有内容。我已经写了一个例子:
#ifndef UNITTEST
#define PRINT_INT_U(x) ((void)sizeof(x))
#else
#define PRINT_INT_U(x) PRINT_INT(x)
#endif
您可以看到,当我不运行单元测试时,我希望我的 PRINT_..._U 函数评估为空,这样我就可以向它发送垃圾邮件,而不必担心它们在运行期间到处弹出调试或生产。
所以我的问题是,是否有一些疯狂的方法使用预处理器生成新的#define 语句?我的猜测是没有...
edit:我至少可以做这样的事情吗?列个清单:
INT
LONG
UINT
ULONG
HEX
FLT
PTR
STR
然后将它们全部插入到模式中
#define PRINT_%LI%_U(x) PRINT_%LI%(x)
其中%LI% 表示列表中的一项。
【问题讨论】:
标签: macros c-preprocessor