linux操作系统程序环境和预处理
编译
分为三个预处理(也叫预编译),编译,汇编
预处理test.c
gcc -E test.c
作用:
1头文件包含(以#开头的为预处理指令)
2注释删除
3#define定义符号的替换编译
gcc -S test.i
作用:
1把源代码编程汇编代码
2进行语法检测(分析),词法分析,语义分析,符号汇总汇编
gcc -o test.o
作用:把汇编代码转换成二进制指令,形成符号表
链接
生成最终文件
linux操作系统简单指令:
ls
(英文全名list)列出当前文件夹的所有文件
cd
(英文全名change directory )更改(切换)目录
mkdir
(英文全名make directory )创建目录(文件夹)
rm
(英文全名remove) 删除文件(-f)
例如 删除一个a.out文件,指令为rm -f a.out。
mv
(英文全名move) 移动文件
touch
(英文全名touch) //创建文件
pwd
(英文全名print work directory)打印当前工作目录
输入vim test.c点击回车进入vim编辑器
输入gcc test.c进入linux环境下编译运行
输入./a.out产生结果
注:vim三种模式:1.普通模式
2.插入模式(按i进入,可以编写代码)
3.命令行模式(输入shift+:进入命令行模式,输入wq,退出vim)
预处理详解
预处理标识符(总结)
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
#define定义标识符
例如:#define MAX 100
注意:#define定义标识符,末尾不能加“;”
#define定义宏
允许把参数替换到文本中
例如:#define MAX(x,y) ((a)>(b))?(a):(b)
注意:对于宏参与用于数值表达式求值时,应该都加上括号,避免使用宏时由于参数中的操作符之间的不可预估的相互作用
#define替换
宏和函数的区别:
宏参数只是做简单的字符串替换,而函数是有参数类型的。
宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时才调用的。因此,宏占用的是编译的时间,而函数占用的是执行时的时间。
如果是较为短小的宏,在程序中的实现会比函数容易,但如果是较为长的宏,每次调用宏时都要将宏原份做字符串替换,所以会显得重复,这是就显得函数较为好用了,因为函数是做值传递,所以不会重复出现。
#define中不能出现自己,即不能出现递归,但函数就可以实现递归。
![](https://i-blog.csdnimg.cn/blog_migrate/604bacf7c88953a38cf38bd5301d6c2f.png)