我想在我的代码中打印最后定义的宏:
#define VAR 1234
#undef VAR
#define VAR 1111
int main(){
printf("%d",VAR);
while(1);
}
输出为1111
如果我想在另一个库中定义。
但是当我在外部库中重新定义VAR
时,输出是第一个定义的值。就是这样:
iIn主要代码:
#include "variable.h"
int main(){
REDEFINE();
printf("%d",VAR);
while(1);
}
variable.h
#define VAR 1234
void REDEFINE(void);
variable.c
void REDEFINE(){
#undef VAR
#define VAR 1111
}
在这种情况下,输出为1234
,REDEFINE()
函数未更改VAR
值。如何在variable.c
中更改我的宏变量而无需在主代码中重新定义?
答案 0 :(得分:0)
预处理器是一次性转换阶段,只需在编译代码之前预先形成令牌替换。
define
和undef
不是可执行语句,它们已经完成,并且在程序完成编译之前很久就已经完成了。
如果需要可修改的值,则需要定义一个变量(具有静态存储持续时间)来保存它。所以不同的variable.c
:
static int value = 1234;
int set_value(int new) {
int prev = value;
value = new;
return prev;
}
int get_value() {
return value;
}
答案 1 :(得分:0)
这不是预处理器的工作原理。到编译器运行时,预处理器的运行结束了。这一切都是在你的程序执行时间之前完成的 - 甚至在程序变成可以执行的程序之前。
VAR
被替换为1234
或1111
,无论哪个在预处理器到达VAR
的行中都有效,因此编译器不会完全看VAR
:相反,它会看到预处理器用于替换的数字。
对REDEFINE()
的调用无效:
void REDEFINE(){
#undef VAR
#define VAR 1111
}
预处理程序指令在预编译器到达新VAR
行时,在您正在编译的翻译单元的空间中将1111
更改为#define
。
答案 2 :(得分:0)
我提供了一个答案,您必须重新定义许多宏并希望在一个文件中执行此操作。但请仔细检查。
这将成为维护地狱。
我有一种迷信,即使用undef
是邪恶的,或者至少是非常不幸的。
不要尝试在.c文件中取消定义。
在新标题中执行此操作。
REDEFINE.H:
#undef VAR
#define VAR 1111
main.c中:
#include <stdio.h>
#include "variable.h"
#include "REDEFINE.H"
int main(){
//REDEFINE(); // not needed
printf("%d",VAR);
while(1); // This is of course not in your actual code,
// make sure that there is a return statement instead.
}