C-宏
#define 定义宏
本质是替换
一、宏常量:
#define MAX 50
优点:提高代码可扩展性、提高可读性、提高了安全性、还可以与case配合
注意:定义宏常量不要加分号,一般宏名全部大写
预定义好的宏常量:
printf("%s\n",__func__); 获取函数名
printf("%s\n",__FILE__); 获取文件名
printf("%d\n",__LINE__); 获取行号
printf("%s\n",__DATE__); 获取日期
printf("%s\n",__TIME__); 获取时间
二、宏函数:
是带参数的宏
不是真正意义的函数,没有发生传参,也没有返回值,也不会去检查参数的类型
#define SUM(a,b) a+b
int num1 = 10,num2 = 20;
printf("%d\n",SUM(num1,num2)*10);
printf("lf\n",SUM(1.43,4.24));
printf("%d\n",SUM1(num1+10,num2));
1、先把在代码中出现了宏函数的位置,替换成宏函数后面的语句
2、再把代码中使用的参数替换成调用者的参数
注意:宏的内容必须保证在同一行,如果要换行,要在每一行的末尾添加续行符 \
三、宏函数的二义性:
由于宏函数代码位置、附近的值、参数各种原因的影响,会导致宏函数有不同的解释,这叫做宏的二义性
如何避免宏的二义性:
每个参数都加小括号,整体也叫小括号,不要在宏函数的参数中使用自变运算符
四、宏函数与普通函数的区别?
如果是普通类型,它们在功能上无任何区别,但本质不同,一个是代码替换,一个是类型重定义
#define INTP int*
INTP p1,p2,p3; //p1是指针 p2 p3是int
int* p1,*p2,*p3
typedef int* INTP;
INTP p1,p2,p3; //p1p2p3都是指针
size_t s1,s2,s3;
五、宏函数与普通函数的区别?
普通函数:是一段觉有某项功能的代码集合,会被编译成二进制指令存储在代码段中,函数名就是它的首地址,有独立的栈内存
宏函数:带参数的宏替换,不是真正的函数,用起来像函数,没有独立的栈内存
普通函数函数: 返回值、类型检查、安全、入栈出栈调用、跳转、速度慢
宏函数:运行结果、通用、危险、替换、冗余、速度快
练习:实现一个交换两个变量值的宏函数,尽可能通用,能写几个,分析每一种的优劣
#include <stdio.h>
//#define SWAP(a,b) {a=a+b; b=a-b; a=a-b;}//有数据溢出可能,不适合结构体
//#define SWAP(a,b) {a=a^b; b=a^b; a=a^b;}//无溢出,只能交换整数
//#define SWAP(a,b) {long double t=a; a=b; b=t;}//不适合结构体
//#define SWAP(a,b,type) {type t=a;a=b;b=t;}//能交换结构体,多一个参数
#define SWAP(a,b) {typeof(a) (t)=(a);(a)=(b);(b)=(t);}//typeof只能在GNU编译器使用
int main(int argc,const char* argv[])
{
int num1 = 10, num2 = 20;
SWAP(num1,num2);
printf("%d %d\n",num1,num2);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」