05c语言——宏定义、带参宏、带参宏函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、宏定义

1.使用规则

#define 标识符 字符串
#define PI 3.1415926
本质:字符串的替换
运行阶段:在程序的预处理阶段

2.注意

注意:
(1)宏名一般要大写(书写习惯,也可以用小写),将系统中本来存在的一些变量名区分开
(2)使用宏名代替字符串,可以减少书写重复字符串的工作量
(3)宏定义不是c语句,不必在行末加分号,会将分号当成字符串的一部分替换
(4)作用域:一般宏定义都会定义在函数的外部,作用域就是从宏定义开始到程序最后一行
(5)固定作用可以设置为,#define PI 3.14----->一直到#undef PI
(6) 在进行宏定义的时候可以进行叠加
(7)如果在使用的时候用引号括起来那么则不会进行等量替换,如"PI",会直接当成字符串而不是标识符。
(8)与定义变量不同,在程序的预编译阶段进行替换,直接进行替换不会重新开辟新的内存

#include <stdio.h>
#define PI 3.14
#define R 2
#define S PI*R*R
#define L 2*PI*R
int main(int argc, const char *argv[])
{
   printf("L=%f\nS=%f\n",L,S);
   return 0;
}

二、带参宏

1.定义

不是进行简单的字符串替换,还要进行参数替换
定义形式为:#define 宏名(参数表) 字符串
#define S(a,b) a*b

2.注意

(1)宏名后面不能有空格,有空格会被认为是字符串的一部分
(2)带参宏只是将参数后面的字符串进行替换,不会考虑运算的优先级。

#define PI 3.1415926
//#define S(r) PI*r*r
//如果传两个参数就会变变成,s=3.1415926*a+b*a+b;这样运算的优先级会出问题
//如果要使运算的优先级没有问题则写成下面的这种形式
#define S(r) PI*(r)*(r)
int main(int argc, const char *argv[])
{
	float a = 2;
	float b = 3;
	float s = 0;
	s=S(a+b);
	printf("sum=%f\n ",s);
	return 0;
}

三、带参函数

1.带参函数的宏与带参宏的区别

(1)带参方式:带参宏函数先进行实参的计算,然后将实参带入形参,带参宏只是进行简单的字符串替换。
(2)执行时间:带参宏函数是在程序运行时进行处理会为形参分配内存单元,带参宏只是在程序的预编译阶段进行没有值传递、没有内存的分配、没有返回值。
(3)形参类型:带参宏函数有实参形参,如果类型不匹配要进行类型转换,带参宏则只是进行字符串的替换。
(4)函数不会使代码体积增大,带参宏回使代码体积增大

2.带参宏函数和普通函数区别:

(1)普通函数只有一个返回值,但是带参函数可以返回多个结果。
(2)带参宏函数是进行展开会使源代码变长,调用次数变多代码会越长,调用函数不会使源代码变长。
(3)宏替换只是在预编译阶段进行,会占用编译时间,函数则是在运行阶段会占用程序的运行时间。

#include <stdio.h>
#define PI 3.1415926
#define CIRCLE(R,S,L,V) S=2*PI*R*R;L=2*PI*R;V=4/3*PI*R*R*R
int main(int argc, const char *argv[])
{
	float R,S,L,V = 0;
	R = 2;
	CIRCLE(R,S,L,V);
	printf("R=%f S=%f L=%f V=%f\n",R,S,L,V);
	return 0;
}

举例:带参宏函数一般用于实现功能比较简单的函数

#include <stdio.h>
#define MAX(a,b) (a)>(b)?a:b
#define MIN(a,b) (a)<(b)?a:b

int main(int argc, const char *argv[])
{
	printf("ret%d\n",MAX(1,2));
	printf("ret%d\n",MIN(1,2));
	return 0;
}

四、条件编译

让一部分代码满足一定的条件进行编译

项目Value
#define定义宏
#ifdef如果定义该宏,则执行代码加入编译
#ifndef如果没定义该宏,则将代码加入编译
#if如果条件为逻辑真值,则将代码加入编译
#elif如果条件为逻辑真值,则将代码加入编译
#else逻辑假,则将代码加入编译
#include <stdio.h>
#define _w_32
#define _w_16
int main(int argc, const char *argv[])
{
#ifdef _w_32
	printf("sizeof int is 4 bytes\n");
#endif

#ifdef _w_16
	printf("sizeof int is 2 bytes\n");
#endif

#if _WIN_
	printf("windows is good\n");
#elif _LINUX_
	printf("linux is good\n");
#else
	printf("unix is good\n");
#endif
	return 0;
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 33
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值