处理这两段代码

avi*_*hse 2 c c-preprocessor

这是两段C代码,但我不明白它们是如何工作的:

计划1:

#include<stdio.h>
#define s 10
fun() {
 #undef s
 #define s 20
}
int main(){
 printf("%d\n",s);
 fun();
 printf("%d\n",s);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)
Output: 20
        20
Run Code Online (Sandbox Code Playgroud)

计划2:

#include<stdio.h>
#define s 10
int main(){
 printf("%d\n",s);
 fun();
 printf("%d\n",s);
 return 0;
}
fun() {
 #undef s
 #define s 20
}
Run Code Online (Sandbox Code Playgroud)
output: 10
        10
Run Code Online (Sandbox Code Playgroud)

我所知道的是预处理器在开始之前工作main()并替换它的所有变量.这fun()是在一个之后调用的printf(),那么两个程序如何通过改变位置来输出不同的值fun()?

1''*_*1'' 5

预处理器不关心范围.它按照从上到下的顺序逐行浏览文件,并进行文本替换.如果事情是#defined或#undef独立非执行董事,它从该行有效,直至该文件的底部(或其他预处理语句覆盖它).


Jey*_*ram 5

宏将在编译时自行替换.所以代码在预处理之后会是这样的,

情况1:

#include<stdio.h>

fun() {
}
int main(){
 printf("%d\n", 20);//latest definition of s will be considered.
 fun();
 printf("%d\n",20);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

案例2:

#include<stdio.h>

int main(){
 printf("%d\n",10); //replaced with 10 only, because in this instance, there is no change in s 
 fun();
 printf("%d\n",10);
 return 0;
}
fun() {
 //#undef s
 //#define s 20 //no use in ur code. 
}

fun_extra() { //Added for demo
   printf("%d\n",s);//will be replaced by 20. 
}
Run Code Online (Sandbox Code Playgroud)