【C语言】简单学——预处理详解(#define和预定义符号)

目录

#define

概念

语法

用法一:直接替换内容

用法二:替换带有参数的宏

预定义符号


如果不知道什么是预处理环节,点此跳转

#define

概念

#define之所以叫预处理指令,是因为这串指令是在预处理阶段起作用的

详见超链接:【深度剖析】可执行程序是如何诞生的

语法

#define 宏名称 替换文本

其中:

  • 宏名称 是你为宏定义的标识符,通常以全写大写字母表示,用以和普通变量名区分开来。
  • 替换文本 是你想要替换成的代码片段,可以是表达式、语句、或者其他代码片段。

用法一:直接替换内容

例如:

#define MAX 100   //一般用全大写来命名
#define STR "abcdef"
#define INT int
#define ANV 3+5

int main()
{
	int max = MAX;
	char arr[] = { STR };
	INT x = 1;
	INT y = ANV * 2;

	printf("%d\n", max);
	printf("%s\n", arr);
	printf("%d\n", x);
	printf("%d\n", y);

	return 0;
}

被定义的标识符会在预处理(预编译)阶段完完全全替换

注意点

  1. #define后面不跟分号(;),因为#define的机制是直接替换,如果加上分号的话,连分号也会一起被替换过去
  2. #define定义标识符存在安全隐患,例如上图的ANV,原本int y 的值是2*8 = 16,但因为#define原封不动替换,所以就会变成3+5*2 = 13,因为运算符优先级而导致出错,所以,如果要用#define来标识表达式,要加上括号

用法二:替换带有参数的宏

概念:

#define除了可以标识一些常规的值,还可以标识一些可以让自己传参的值(像函数那样玩)

这种实现被称为宏或者定义宏

例子:

#define ADD(x, y) x+y

int main()
{
	int sum = ADD(3, 4) * 2;

	return 0;
}

注意点

①在  #define ADD(x, y) x+y  中,左括号必须要紧挨着ADD,否则会被以为是第一种用法(定义标识符)

②定义宏和定义标识符一样,都存在安全隐患,可能会导致和原本的代码逻辑相悖,也应该要加上括号,改为:#define ADD(x, y)  ((x) + (y))

ps:因为x和y有可能不只是一个值,有可能是一个表达式,所以x和y也要单独用括号括起来

预定义符号

概念:这是语言内置的符号,在预处理环节会自动替换掉

以下为部分预定义符号:

  •   __FILE__  :当前编译的源文件路径
  •   __LINE__  :当前的行号
  •   __DATE__ :当前的日期
  •   __TIME__  :当前文件被编译的时间
  •   __STDC__ :判断当前编译器是否遵守ANSI C的规则,如果遵守就替换成1,否则替换成0
  •   __FUNCTION__ :替换成这个预定义符号所在的函数的名字(例如:main)

左侧为预处理之前,右侧为预处理之后

↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlZ大牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值