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所述.这两个步骤通常被称为"预处理"和"编译"(虽然含糊不清,但整个翻译过程通常也称为"编译").它们甚至可以由单独的程序实现,"编译器"在执行任何其他操作之前根据需要运行"预处理器".因此,运行时间太晚,无法尝试返回并更改宏扩展到的内容.
你不能.
由于宏在编译本身之前由预处理器解析,因此将其内容直接复制到您使用它的位置.
您仍然可以使用参数根据需要插入条件语句,或使用调用范围可访问变量.
如果要更改单个值,请更好地使用全局范围变量,即使不鼓励这样做.(作为宏的密集使用)