c语言进阶篇:宏

本文详细探讨了C语言中的宏定义,包括替换文本、字符串宏常量、宏定义中的空格、#和##的用法、带有副作用的宏参数、undef以及宏与函数的对比。强调了在使用宏时要注意的事项,如运算优先级、宏参数的副作用,推荐在需要多语句替换时使用do-while-zero结构,并提醒开发者宏的局限性和潜在问题。
摘要由CSDN通过智能技术生成

define本质上是将文本内容在编译时进行替换,又因为他可以替换参数所以就出现了宏。

#define替换文本

语法:#define name stuff

举一个例子

#define MAX 1000
#define reg register          //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)     //用更形象的符号来替换一种实现
#define CASE break;case        //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
							__FILE__,__LINE__ ,\
							__DATE__,__TIME__ )   

我们C语言的程序员内部有默契,我们把#define定义的一般做全大写函数命名一般不是全大写一般是首字母大写或其他部分大写,当然我们宏定义假做成函数也会没有全大写。

#define定义宏

#define允许把参数替换到文本中,这种实现通常被称为宏,或定义宏

definename(由逗号隔开的符号) stuff

举例:

#include<stdio.h>
#define SQUARE(x) x*x
int main()
{
   
	printf("%d", SQUARE(3));
	return 0;
}

![[202201210943514.png]]

值得注意的是:
上面的宏其实有一个很大的弊病.

我们用下面的代码来说明:

#include<stdio.h>
#define SQUARE(x) x * x
int main()
{
   
	printf("%d", SQUARE(3+2));
	return 0;
}

![[202201210945131.png]]

这并不是我们想要的答案我们想得到5*5可是这个宏定义给的式子却给了我们11这是因为我们在定义宏时没有考虑到运算的优先级.

首先我们的宏在编译阶段会直接和代码替换本次的宏就将printf函数内容进行了替换使SQUARE(3+2)替换成了3+2*3+2这样我们就得到了11的值。

所以使用宏的时候一定要加括号!加括号!

#include<stdio.h>
#define SQUARE(x) ((x) * (x))
int main()
{
   
	printf("%d"
  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Елена_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值