C预处理器宏定义的优先级

时间:2017-04-19 12:48:32

标签: c macros c-preprocessor

我想在我的代码中打印最后定义的宏:

#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
}

在这种情况下,输出为1234REDEFINE()函数未更改VAR值。如何在variable.c中更改我的宏变量而无需在主代码中重新定义?

3 个答案:

答案 0 :(得分:0)

预处理器是一次性转换阶段,只需在编译代码之前预先形成令牌替换。

defineundef不是可执行语句,它们已经完成,并且在程序完成编译之前很久就已经完成了。

如果需要可修改的值,则需要定义一个变量(具有静态存储持续时间)来保存它。所以不同的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被替换为12341111,无论哪个在预处理器到达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.
}