这是两段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()?
预处理器不关心范围.它按照从上到下的顺序逐行浏览文件,并进行文本替换.如果事情是#defined或#undef独立非执行董事,它从该行有效,直至该文件的底部(或其他预处理语句覆盖它).
宏将在编译时自行替换.所以代码在预处理之后会是这样的,
情况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)