在C中运行时更改宏

lig*_*use 33 c c-preprocessor

我有一个宏定义.但我需要在运行时根据条件更改此值.我该如何实现呢?

fbr*_*eto 29

在源文件甚至编译之前,宏会被预处理器替换为它们的值.您无法在运行时更改宏的值.

如果你可以解释一下你正在努力实现的目标,毫无疑问还有另一种解决你的问题的方法,不包括宏.


Ste*_*sop 25

您无法更改宏本身,即它扩展到的内容,但可能您可以更改涉及宏的表达式的值.对于一个非常愚蠢的例子:

#include <stdio.h>

#define UNCHANGEABLE_VALUE 5
#define CHANGEABLE_VALUE foo

int foo = 5;

int main() {
    printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
    CHANGEABLE_VALUE = 10;
    printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
}
Run Code Online (Sandbox Code Playgroud)

因此,您的问题的答案取决于您希望您的更改对使用宏的代码产生何种影响.

当然5是编译时常量,而foo不是,所以如果你计划CHANGEABLE_VALUE用作case标签或其他什么,这不起作用.

请记住,C源的翻译有两个(实际上更多)阶段.在第一个(我们关心的两个)中,扩展了宏.完成所有操作后,程序将进行"语法和语义分析",如5.1.1.2/2所述.这两个步骤通常被称为"预处理"和"编译"(虽然含糊不清,但整个翻译过程通常也称为"编译").它们甚至可以由单独的程序实现,"编译器"在执行任何其他操作之前根据需要运行"预处理器".因此,运行时间太晚,无法尝试返回并更改宏扩展到的内容.

  • @ 0A0D:它说,"你不能使用const int对象作为案例标签(当宏工作时)".这并不意味着*any*macro是一个合法的案例标签,或者使用宏以某种方式神奇地允许你在案例标签中使用你本来不能的东西.AndreyT将`const int`对象与定义为整数文字*的宏*进行比较.`case UNCHANGEABLE_VALUE:`没关系,`case CHANGEABLE_VALUE:`不是. (5认同)

Ada*_*kin 13

你不能.宏由预处理器扩展,甚至在编译代码之前就会发生.它纯粹是文字的替代品.

如果您需要在运行时更改某些内容,只需使用实际函数调用替换宏.


Geo*_*roy 7

你不能.

由于宏在编译本身之前由预处理器解析,因此将其内容直接复制到您使用它的位置.

您仍然可以使用参数根据需要插入条件语句,或使用调用范围可访问变量.

如果要更改单个值,请更好地使用全局范围变量,即使不鼓励这样做.(作为宏的密集使用)