前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言学习——预处理命名「建议收藏」

C语言学习——预处理命名「建议收藏」

作者头像
全栈程序员站长
发布2022-09-23 19:49:51
4400
发布2022-09-23 19:49:51
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一、宏定义

编译:对源程序进行词法、语法分析,生成代码,优化等。 作用:在编译之前,对源程序中的特殊命令做一些处理,生成扩展C源程序 种类: 宏定义 #define 文件包含 #include 条件编译 #if #else #endif等 格式: “#”开头 占单独书写行 语句尾不加分号

在这里插入图片描述
在这里插入图片描述

2)C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。

对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。

带参宏定义的一般形式为: #define 宏名(形参列表) 字符串

#define M(y) yy+3y // 宏定义 printf(“S=%d\n”, M(5));

(3)在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。

这一点和函数是不同的:在函数中,形参和实参是两个不同的变量,都有自己的作用域,调用时要把实参的值传递给形参;而在带参数的宏中,只是符号的替换,不存在值传递的问题。

代码语言:javascript
复制
#include <stdio.h>
#define SQ(y) (y)*(y)
int main()
{ 
   
	int a, sq;
	printf("input a number: ");
	scanf_s("%d", &a);
	sq = SQ(a + 1);
	printf("sq=%d\n", sq);
	return 0;
}
在这里插入图片描述
在这里插入图片描述

(4) 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。例如上面的宏定义中 (y)*(y) 表达式的 y 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形式:

代码语言:javascript
复制
#include <stdio.h>
#define SQ(y) y*y

int main()
{ 
   
	int a, sq;
	printf("input a number: ");
	scanf_s("%d", &a);
	sq = SQ(a + 1);
	printf("sq=%d\n", sq);

	return 0;
}
在这里插入图片描述
在这里插入图片描述

二、“文件包含”处理

在这里插入图片描述
在这里插入图片描述

三、条件编译

条件编译是指预处理器根据条件编译指令,有条件地选择源程序代码中的一部分代码作为输出,送给编译器进行编译。主要是为了有选择性地执行相应操作,防止宏替换内容(如文件等)的重复包含。常见的条件编译指令如下表 所示。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170991.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、宏定义
  • 二、“文件包含”处理
  • 三、条件编译
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档