首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C预处理宏定义的优先级

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

Stack Overflow用户
提问于 2017-04-19 12:48:32
回答 3查看 1K关注 0票数 0

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

代码语言:javascript
复制
#define VAR   1234

#undef  VAR
#define VAR   1111
int main(){

printf("%d",VAR);
while(1);
}

输出为1111

如果我想在另一个库中定义..

但是,当我在外部库中重新定义VAR时,输出是第一个定义的值。就是这样:

iIn主要代码:

代码语言:javascript
复制
#include "variable.h"

int main(){
   REDEFINE();
   printf("%d",VAR);
   while(1);
}

variable.h

代码语言:javascript
复制
#define VAR 1234
void REDEFINE(void);

variable.c

代码语言:javascript
复制
void REDEFINE(){
    #undef VAR
    #define VAR 1111
}

在这种情况下,输出是1234,而REDEFINE()函数没有更改VAR值。如何更改variable.c中的宏变量而不必在主代码的顶部重新定义?

EN

回答 3

Stack Overflow用户

发布于 2017-04-19 12:54:19

预处理器是一个一次性转换阶段,它在编译代码之前只做预制件令牌替换。

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

如果您想要一个可修改的值,您需要定义一个变量(具有静态存储时间)来保存它。所以不同的variable.c

代码语言:javascript
复制
static int value = 1234;

int set_value(int new) {
  int prev = value;
  value = new;
  return prev;
}

int get_value() {
  return value;
}
票数 0
EN

Stack Overflow用户

发布于 2017-04-19 12:55:29

这不是预处理程序的工作方式。编译器运行时,预处理器的运行已经结束。所有这些都是在程序执行时间之前完成的--甚至在你的程序变成可以执行的东西之前。

VAR会被12341111替换,无论哪一个是在预处理器到达VAR行时生效的,所以编译器根本看不到VAR:相反,它看到的是预处理器用于替换它的数字。

REDEFINE()的调用没有任何效果:

代码语言:javascript
复制
void REDEFINE(){
#undef VAR
#define VAR 1111
}

当预处理器到达新的VAR行时,预处理器指令在您正在编译的转换单元的空间内将1111更改为#define

票数 0
EN

Stack Overflow用户

发布于 2017-04-19 17:57:50

我给出了一个答案,您确实需要重新定义许多宏,并且希望在一个文件中这样做。但是请再查一遍。

这将成为一个维护地狱。我有一种迷信,认为使用undef是邪恶的,或者至少非常不幸。

不要试图在.c文件中重新定义.

在一个新的标题中这样做。

REDEFINE.H:

代码语言:javascript
复制
#undef VAR
#define VAR 1111

C.主要:

代码语言:javascript
复制
#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.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43496222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档