【问题标题】:Dynamically change define macros in c在 c 中动态更改定义宏
【发布时间】:2023-03-14 23:44:01
【问题描述】:

我不确定我的问题是否有意义,但我正在尝试编写一个程序,如果程序中使用了特定标志,它会更改定义宏的值。

默认情况下,定义值设置为 256,如果用户输入./program_name value,我希望该值是新的定义宏。这是下面的c代码。

在文件顶部定义的宏:

#define NUMBER_OF_VALUES 256

主函数内部:

if (strcmp(argv[1], "256")) {
    #ifdef NUMBER_OF_VALUES
    #undef NUMBER_OF_VALUES
    #define NUMBER_OF_VALUES 128
    #endif
}
else if (strcmp(argv[1], "128")) {
    // do nothing
}

这段代码的工作原理,或者我发现它的工作原理是,如果输入的值是 256,它什么也不做,而当值是 128 时,它会尝试取消定义宏并用新值(即 128)再次定义它。

但是,这不起作用,当使用 128 的值时,它仍然默认执行 256 的值。

【问题讨论】:

  • 宏是编译时构造(甚至是预编译)。这就是要了解“动态”宏是不可能的。

标签: c


【解决方案1】:

宏在编译之前处理,更不用说运行时了。因此,动态定义宏是不可能的。

最接近的方法是创建一个全局变量并通过指针对其进行修改。

但是,最好只使用具有默认值的局部变量。

int NUMBER_OF_VALUES = 256;
if (strcmp(argv[1], "128")) {
   NUMBER_OF_VALUES = 128
}

如果您打算在运行时使用 NUMBER_OF_VALUES 来分配特定大小的堆栈数组,那根本不可能。您需要调用 malloc。

【讨论】:

    【解决方案2】:

    您不能在运行时更改宏,因为它们甚至在编译器看到它们之前就由预处理器评估,并替换为它们各自的文本表示。

    这是在实际编译器开始编译代码之前完成的。

    当您将-E 开关与gcc 一起使用时,您甚至可以自己看到这一点。对于其他编译器,他们可能会提供类似的选项。

    【讨论】:

      【解决方案3】:

      编译器首先将 .c 转换为 .o 形式,然后将其转换为 .exe 形式。 (对于 Windows)在从 .c 到 .o 的转换中,宏代码被转换为数值。其他变量在步骤 2 中进行评估。因此,无法在运行时更改宏值。

      【讨论】:

        猜你喜欢
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 2023-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多