笔记--C的编译预处理指令
1、#编译预处理
编译的顺序:
使用gcc编译:
gcc myC.c
如果不指定文件名,在windows中编译完成后即可得到 a.exe
在linux中,会得到a.out
如果使用-o指定文件名:
gcc -o main.exe main.c
则编译后得到 main.exe文件
使用gcc编译时,保存临时变量,可以看到编译的中间文件 使用参数 --save-temps
gcc main.c --save-temps
得到文件:main.i main.o main.s 和a.exe
其中 main.i main.o main.s 这三个文件是临时文件
编译时生成文件的顺序是:
.c ->.i -> .s -> .o -> a.exe
宏定义 #define
宏定义的文本在代码中会被原原本本的替换
双斜杠的注释 在define中也一样是注释,不会替换到c文件中。
宏定义 可以换行,最后使用一个反斜杠\ 标记
预定义的宏
预定义的宏,左右都有两个下划线
__FILE__ 源代码的文件名 字符串
__LINE__ 源代码文件的行号 整数
__DATE__ 编译的日期 字符串
__TIME__ 编译的时间 字符串
__STDC__
带参数的宏
#include <stdio.h>
#include <stdlib.h>
#define cube(x) ((x)*(x)*(x))
int main()
{
printf("%d\n", cube(5));
return 0;
}
//cube(5) -> cube(x) 被替换为((x)*(x)*(x))
//然后用5替换x -> (5)*(5)*(5) -> 125
宏 就是直接替换,带参数的宏,看起来和函数定义差不多,但是在定义的时候 一定要注意:
一切带参数的宏,如果是要进行计算,都要用括号括起来,否则可能得不到想要的结果
一切的参数的使用,都要使用括号括起来
例如:
#include <stdio.h>
#include <stdlib.h>
#define cube(x) ((x)*(x)*(x))
#define func1(x) (x*10)
#define func2(x) x*10
#define func3(x) (x)*10
int main()
{
printf("%d\n", func1(5));
printf("%d\n", func1(5+2));
printf("%d\n", func2(5+2));
printf("%d\n", 100/func2(5+2));
printf("%d\n", func3(5+2));
printf("%d\n", 100/func3(5+2));
return 0;
}
//结果为:
50 (5*10)
25 (5+2*10)
25 5+2*10
40 100/5+2*10
70 (5+2)*10
140 100/(5+2)*10
以上例子可以看出,宏是原样替换,如果在定义带参数的宏的时候,不加括号,结果计算顺序完全变样了,所以带参数的宏定义,一定要加括号,参数一定要加括号,一切都要有括号