这里是我的宏的一个样本:在宏上运行的预处理宏?
#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语句一些疯狂的方法?我的猜测是,有没有...
编辑:我可以至少做这样的事情吗?做一个清单:
INT
LONG
UINT
ULONG
HEX
FLT
PTR
STR
,然后他们都各插入模式
#define PRINT_%LI%_U(x) PRINT_%LI%(x)
其中%LI%
代表列表中的项目。
您在寻找LISP/Scheme吗? – Mehrdad 2011-03-19 03:31:04