#define 、#include 等在预处理阶段处理而在编譯时已经不存在了,所以它们不是关键字
优势:原地展开没有调用开销;并且在预处理阶段完成,不占用编译的时间
缺点:不进行类型檢查实际传参和宏所希望的参数类型必须一致,否则可能出现编译不报错但是运行有误
#define 宏名 宏体(为安全起见加括号)
带参函数与带參宏定义的对比:
函数是编译期间处理的,在调用函数(用栈来做支持调用一次就会进行一次压栈)处跳转到函数中去执行,跳转执行唍再返回有比较大的调用开销。
宏定义是预编译期间原地展开没有调用开销,没有传参开销函数体很短时可以用宏定义来替代,提高效率
内联函数本身是函数所以编译器会进行参数的静态类型检查;同时内联函数原地展开,没有调用开销
命令格式:gcc [选项] [文件名]
-E:仅執行编译预处理;
-c:仅执行编译操作不进行连接操作;
-S:将C代码转换为汇编代码;
-o:指定生成的输出文件;
- I:指定查找头文件的目录。
宏定义:宏定义在预处理阶段由预处理器进行原封不动的替换(替换会递归进行直到替换出来的值不是宏为止)
:在源代码级别去修改配置开关来让程序编译出不同的结果
去掉程序中的注释:移除所有的注释有一个空格替换
GCC编译工具链:包括预处理器、编译器、汇编器、链接器
GCC进行编译链接的过程:四个步骤
执行 ./test 即可输出程序执行结果
带库文件连接的gcc编译指令
注:默认情况下,GCC都是采用动态链接库的因此苼成的可执行文件小了很多。可以使用-static强制进行静态链接不过可执行文件就会很大。
}