【问题标题】:C Macro get token value instead of token nameC宏获取令牌值而不是令牌名称
【发布时间】:2022-01-13 07:11:51
【问题描述】:

请查看以下 c 中的代码片段并查看 cmets。有没有办法让这成为可能?预处理器是否已经知道 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)

【问题讨论】:

  • 枚举不是预处理器常量,因此您不能在预处理器阶段将其扩展为整数常量。

标签: c macros concatenation c-preprocessor


【解决方案1】:

由于您希望预处理器用其值替换标记,因此您需要预处理器。所以第一步是使用#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”,则可以检查生成的源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多