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”,您可以检查生成的源代码。
请查看下面在 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”,您可以检查生成的源代码。