如何欺骗预处理器

时间:2017-08-24 09:47:50

标签: c macros c-preprocessor

我在代码中有一些宏

#define NUM_IN 3

#define NUM_1 1
#define NUM_2 2
#define NUM_3 3

#define MY(NUMBER) NUM_##NUMBER

所以,如果我正在调用宏

MY(NUM_IN)

我希望预处理结果为3,但我得到NUM_NUM_IN

所以,我应该这样做,预处理器将输入

第1步

MY(NUM_IN)

第2步

MY(3)

第3步

NUM_3

第4步

3

请让我知道我错过了什么。我是stackoverflow的新手,所以如果我错了,请引导我到正确的渠道 谢谢

3 个答案:

答案 0 :(得分:2)

添加一层间接:

#define CAT_(a, b) a ## b     /* Pastes  */
#define CAT(a, b)  CAT_(a, b) /* Expands */

#define MY(NUMBER) CAT(NUM_, NUMBER)

答案 1 :(得分:2)

添加一个间接层:

#define NUM_IN 3

#define NUM_1 1
#define NUM_2 
#define NUM_3 3

#define CAT_(X,Y) X##Y
#define MY(NUMBER) CAT_(NUM_,NUMBER)

MY(NUM_IN)

答案 2 :(得分:1)

宏参数在被替换为宏体之前完全进行宏扩展,除非将它们与其他标记进行字符串化或粘贴 1

因此,在MY(NUM_IN)中,NUM_IN不会扩展。您需要为连接定义另一个宏

#define PASTER(n) NUM_ ## n
#define MY(NUMBER) PASTER(NUMBER)

<子> 1。 GCC文档:3.5 Concatenation