文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言预编译#define(预处理)

2024-04-02 19:55

关注

一、预定义符号

预定义符号是系统本身定义的:

二、#define 定义标识符

语法:#define name stuff (用stuff替换name)

#define MAX 100   
#define STR "hehe"
int main()
{
	int max = MAX;
	printf("%d\n", max);  //输出100
	printf("%s\n",STR);   //输出 hehe
	return 0;
}

三、#define 定义宏

#define SQUARE(X) X*X
int main()
{
	int ret = SQUARE(5);
	printf("%d\n",ret); //输出25
	return 0;
}

上面的宏定义代码存在一定的问题: 如果我们换一个参数(将5换成5+1)输出的不是36而是11为什呢?

#define SQUARE(X) X*X
int main()
{
	int ret = SQUARE(5+1);//替换之后就是(5+1*5+1 = 11)
	printf("%d\n",ret);//输出11
	return 0;
}

没加括号
因此,用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或临近操作符之间不可预料的相互作用。

正确的代码:

#define SQUARE(X) (X)*(X))
int main()
{
	int ret = SQUARE(5+1);
	printf("%d\n",ret);//输出36
	return 0;
}

四、#define 替换规则:

五、#和## 两个符号(少见)

#的作用:把参数插入到字符串中

如果我们想要实现一个代码:把参数插入到字符串中 用到“#”

这里参数a,b就插入到了字符串中了
 ##的作用:可以把位于它两边的符号合成一个符号,它允许宏定义冲从分离的文本片段创建标识符。

图中的三句代码是等价的:

printf(“%d\n”,AGE(lisa,24));
printf(“%d\n”,AGE(lisa##24));
printf(“%d\n”,AGE(lisa24));

六、宏和函数的对比

函数和宏都能实现求两个数的最大值

//函数
int Max(int x, int y)
{
	return (x > y ? x : y);
}
//宏
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
int main()
{
	int a = 10;
	int b = 20;
	int max = Max(a, b); //输出20
	printf("%d\n",max);
	max = MAX(a, b);
	printf("%d\n", max); //输出20
	return 0;
}

通过分析上面的代码实现用宏比用函数会更好,有两个原因:

当然宏相比函数也有劣势的地方:

#define定义宏和函数的对比表格

属性#define定义宏函数
代码长度每次使用时宏代码都会被插入到程序中除了非常小的宏之外,程序的长度会大幅度增长函数的代码只出现在一个地方,每次使用这个函数时,都调用那个地方的同一份代码
执行速度更快存在函数的调用和函数的额外开销,所以速度相对慢一些
操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否者邻近操作符的优先级可能产生不可预料的结果,所以建议宏在书写的时候多用括号函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。
带有副作用的参数参数可能被替换带宏中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果函数参数只在传参的时候求值一次,结果更容易控制
参数类型宏的参数与类型无关,只要对参数的操作是合法的,它就可以适用于任何参数类型函数的参数与类型有关,如果参数的类型不同,就需要不同的函数,即使他们执行任务是不同的
调试和递归宏不方便调试,不能递归函数可以逐语句调试,可以递归

命名约定:把宏名全部大写,函数名不要全部大写。

七、#undef

#undef 指令用于移除一个宏定义

当#undef 移除宏定义,再次使用报错。如图 :

到此这篇关于C语言预编译#define(预处理)的文章就介绍到这了,更多相关C语言预处理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯