编译器使用的是gcc。在学习C语言的宏定义和inline关键字修饰函数时,为了能很好的明白二者的区别,所以这里就记录下二者在预处理时生成中间文件的区别。
宏定义:
- 优点:不会生成中间代码,在调用处会直接替换掉指定的宏名称
- 缺点:不会检测传入的参数合法性和参数的类型,只是在调用的位置进行了简单的替换
生成中间文件的区别
1.宏定义
使用宏的方式很简单,通过关键字#define 标志名 表达式的格式来定义宏,如果是多个表达式的方式,则需要\的方式来增加多个表达式,如下函数
#include <stdlib.h>
#define add(x,y) ((x)+(y))
#define TAG "MACRO"
#define log(tag,msg) printf(#tag ":%s\n" ,#msg)
int main()
{
int a=10;
int b=9;
int c=add(a,b);
const char* msgxx="test macro";
printf("c=%d\n",c);
printf("TAG:%s\n",TAG);
log("aaa",msgxx);
return 0;
}
通过gcc -E main.c -o main.i 查看中间文件 ,省略掉引入头文件的内容,如下是预编译代码
//省略的头文件中间代码
# 3 "main.c&