【问题标题】:Get define value in preprocessor time in c在c中的预处理器时间内获取定义值
【发布时间】:2020-05-25 05:21:19
【问题描述】:

我想使用宏扩展创建一个定义。 crated 定义应保存另一个定义的值。 :)

例子:

#define ONE            1
#define TWO            2
#define MACRO(x, y)    ...
...
#define MACRO_1_2      3

我的问题是:如何在宏扩展中解析/使用定义的值?

我尝试过使用

#define TEST_MACRO_V2(x, y)      TEST_MACRO_V2_"x"_"y"

,但我收到以下错误:

main.c:18:34: error: ‘TEST_MACRO_V2_’ undeclared (第一次在这个函数中使用) #define TEST_MACRO_V2(x, y) TEST_MACRO_V2_"x"_"y"

我的测试代码:

#include <stdio.h>

#define ONE   1
#define TWO   2

#define TEST_MACRO_V1(x, y)      TEST_MACRO_V1_##x##_##y
#define TEST_MACRO_V1_ONE_TWO    3

//#define TEST_MACRO_V2(x, y)    TEST_MACRO_V2_##('x')##_##('y')  -> this version does not work
#define TEST_MACRO_V2(x, y)      TEST_MACRO_V2_"x"_"y"
#define TEST_MACRO_V2_1_2        4

int main()
{
    printf("Test Macro V1: %d\n", TEST_MACRO_V1(ONE, TWO));
    printf("Test Macro V2: %d\n", TEST_MACRO_V2(ONE, TWO));

    return 0;
}

注意:TEST_MACRO_V1 工作正常。我需要 TEST_MACRO_V2。

【问题讨论】:

  • 使用 V2 需要做哪些 V1 无法做到的事情?
  • :) 解决方案应独立于宏参数的名称。这意味着,用户可以使用其他定义名称,但是这个定义总是具有相同的值,例如 0,1,2 ... 所以,在“结束定义”中,我需要宏调用中使用的定义的值。跨度>
  • 不清楚你在问什么。请准确发布TEST_MACRO_V2(ONE, TWO) 的预期扩展应该是什么,或者您发布的程序的预期输出是什么
  • 还要解释一下MACRO_1_2TEST_MACRO_V1_ONE_TWOTEST_MACRO_V2_1_2的意义何在?

标签: c macros c-preprocessor


【解决方案1】:

我在 ideone.com 上试过这个:

#include <stdio.h>

#define ONE   1
#define TWO   2

#define TEST_MACRO_HELPER(x, y) TEST_MACRO_##x##_##y
#define TEST_MACRO(x, y)        TEST_MACRO_HELPER(x, y)
#define TEST_MACRO_1_2          4

int main()
{
    printf("Test Macro: %d\n", TEST_MACRO(ONE, TWO));
    return 0;
}

输出:

Test Macro: 4

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多