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);
}

posted @   冲他丫的  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示