這裏是我的宏的一個樣本:在宏上運行的預處理宏?
#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