gpt4 book ai didi

c - 为什么取消定义宏会在#undef 到达之前生效?

转载 作者:行者123 更新时间:2023-11-30 21:02:11 25 4
gpt4 key购买 nike

#include <stdio.h>

void f(void);

#define N 100

int main(void)
{
f();
#ifdef N
#undef N
#endif

return 0;
}

void f(void){
#if defined(N)
printf("N is %d\n",N);
#else
printf("N is undefined\n");
#endif // defined
}

抱歉,与之前一样的问题,但略有不同。这里编写的相同代码 N 未定义

#include <stdio.h>

void f(void);

#define N 100

int main(void)
{
#if defined(N)
printf("N is %d\n",N);
#else
printf("N is undefined\n");
#endif // defined
/**f();
#ifdef N
#undef N
#endif**/

return 0;
}

/**void f(void){
}**/

但是,如果我在 main 中编写 f 函数的定义,则会打印输出 N is 100。为什么会出现此打印以及为什么会出现差异?

最佳答案

你必须在脑海中区分两个时间线:

  • 编译时间表 - 即编译程序时发生的事情,以及
  • 运行时间线 - 即程序运行时发生的事情

这两个时间线是相互独立的。编译时间线大致对应于程序的文本顺序,并对 #include 处理和宏扩展进行了一些更正。运行时间线由程序的控制结构、函数调用等决定。

由于这两个时间线是独立的,因此在编译时间线期间到达 Y 点之前的代码中的 X 点很可能在运行期间到达 Y 点之后时间线。此外,它可能会多次到达 - 在另一个点 Y 之前和之后。

现在让我们回到你的问题。 #define和宏在编译时展开,因此beforeafter专门指编译时间线。当您将 #undef 放在 main 中的函数 f 上方时,取消定义发生在使用之前 N,导致编译时错误。运行时间线,根据该时间线,f 的调用发生在未定义之前,没有相关性,因为 #define 是独占编译-时间构造。

关于c - 为什么取消定义宏会在#undef 到达之前生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32165700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com