C 宏获取令牌值而不是令牌名称

C Macro get token value instead of token name

请查看下面在 c 中截取的代码并查看注释。有没有办法使这成为可能?预处理器是否已经知道 spn_1 = 18?无论如何使用 spn_1 的值作为令牌名称?

#define TEST_M(_spn) struct astruct _test_struct_##_spn = { .spn = _spn, };

enum spns {
    spn_1 = 18,
};

struct astruct {
    int spn;
};

TEST_M(spn_1)

// What I want:
// struct astruct _test_struct_18 = { .spn = 18, };
// What I get:
// struct astruct _test_struct_spn_1 = { .spn = 18, };
// I can do, but I want attach a name to 18:
// TEST_M(18)

由于您希望预处理器用其值替换标记,因此您需要预处理器。所以第一步是使用 #define 而不是枚举。

但是由于宏展开的顺序,第二步是使用中间宏。

#define TEST_M2(_spn) struct astruct _test_struct_##_spn = { .spn = _spn, };
#define TEST_M(_spn) TEST_M2(_spn)

#define SPN_1 18

struct astruct {
    int spn;
};

TEST_X(SPN_1)
TEST_X(18)

这也适用于文字数字。

如果使用 GCC 选项“-E”,您可以检查生成的源代码。