2011-02-28 26 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