笔记--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


以上例子可以看出,宏是原样替换,如果在定义带参数的宏的时候,不加括号,结果计算顺序完全变样了,所以带参数的宏定义,一定要加括号,参数一定要加括号,一切都要有括号

带参数的宏,可以带多个参数

带参数的宏,也可以组合(嵌套)使用其他宏

宏定义的时候,不要在结尾有分号

部分宏 会被inline函数取代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值