#include < >是从系统目录去找
#include " "是从当前目录去找
gcc的-I选项可以把某些文件加入到系统目录中
如gcc a.c -I. 就可以把当前目录的所有文件加入到系统目录中,这样就可以用<>了
把原来的include <stdio.h>
变成
extern int printf (const char *__restrict __format, ...);
extern int printf (const char *__restrict __format, ...);
int main(){
#if aa == bb
printf("Yes\n");
#else
printf("No\n");
#endif
}
重新运行,得到同样的结果。
表明预编译的作用仅仅就是展开#include的头文件,用来对所有的函数进行声明,头文件里的内容没有函数的定义,仅仅是函数的声明。
-E是进行预编译操作
,可以看到将所有的带#的代码都去掉了
,用新的代码替代。
extern int printf (const char *__restrict __format, ...);
int main(){
#ifdef __x86_64__
printf("x86-64\n");
#else
printf("x86\n");
#endif
#if aa == bb
printf("Yes\n");
#else
printf("No\n");
#endif
}
为什么aa=bb成立?
由上可见,#ifdef
或#if
后面跟着的那个字符串,区分为定义了的字符串和没定义的字符串,由于aa和bb都是没有被定义的,所以空=空
a.c
int foo(int n){
int sum = 0;
for (int i=1;i<n;i++){
sum += 1;
}
return sum;
}
b.c
int foo(int);
int main() {
printf("%d\n",foo(100));
}
C语言中一切皆可取地址,包括代码,数据,堆栈。在汇编语言的视野里,所有东西都是地址。整个程序所做的事就是一个状态机,所作的唯一的事就是指令从内存中读取内容,存到寄存器,算一下再写到内存