2011-02-28 73 views
10

是否可以編寫#define定義#define如何在C中定義一個定義?

例如:

#define FID_STRS(x) #x 
#define FID_STRE(x) FID_STRS(x) 
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v) 

但是相反:

#define FID_DECL2(n, v) #define FIDN_##n v \ 
           FIDS_##n FID_STRE(v) 

FID_DECL工作正常,但創建兩個靜態變量。是否可以使FID_DECL2工作並定義兩個定義?

+1

「兩個靜態變量」有什麼不對呢? – 2011-02-28 15:41:26

+0

http://stackoverflow.com/questions/5136471/multi-pass-c-preprocessor – aaz 2011-02-28 15:45:17

+0

@James:兩個靜態變量都很好,除了我想要與我的字符串聯繫的字符串定義: FID_DECL(HELLO,2) printf(「Hello world」FIDS_HELLO) - >「Hello world2」 – 2011-03-04 12:55:50

回答

12

否;預處理在一次執行中執行。如果您想要或需要更高級的行爲,請考慮使用另一個工具對源進行預處理,例如m4。

此外,在更換列表中的#(在#define FIDN...開始將被解析爲#(stringize)運算符:此運算符的操作數必須是一個名爲宏參數,這define

0

。沒有同時定義宏ü應該照顧的一件事 ,宏觀不應調用本身(reccursively)直接 或間接

我知道兩個靜態變量耗時8個字節將是廣闊的妳。

我已經解決了它

#define FID_STRS2(x) #x 
#define FID_STRE(x) FID_STRS2(x) 
#define FID_DECL(n, v) static int FIDN_##n = v;static const char *FIDS_##n = FID_STRE(v) 

只需重命名他們去reccursive