我想在我的代码中打印最后定义的宏:
#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中的宏变量而不必在主代码的顶部重新定义?
发布于 2017-04-19 12:54:19
预处理器是一个一次性转换阶段,它在编译代码之前只做预制件令牌替换。
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;
}发布于 2017-04-19 12:55:29
这不是预处理程序的工作方式。编译器运行时,预处理器的运行已经结束。所有这些都是在程序执行时间之前完成的--甚至在你的程序变成可以执行的东西之前。
VAR会被1234或1111替换,无论哪一个是在预处理器到达VAR行时生效的,所以编译器根本看不到VAR:相反,它看到的是预处理器用于替换它的数字。
对REDEFINE()的调用没有任何效果:
void REDEFINE(){
#undef VAR
#define VAR 1111
}当预处理器到达新的VAR行时,预处理器指令在您正在编译的转换单元的空间内将1111更改为#define。
发布于 2017-04-19 17:57:50
我给出了一个答案,您确实需要重新定义许多宏,并且希望在一个文件中这样做。但是请再查一遍。
这将成为一个维护地狱。我有一种迷信,认为使用undef是邪恶的,或者至少非常不幸。
不要试图在.c文件中重新定义.
在一个新的标题中这样做。
REDEFINE.H:
#undef VAR
#define VAR 1111C.主要:
#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.
}https://stackoverflow.com/questions/43496222
复制相似问题