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

C语言学习——预处理命名「建议收藏」一、宏定义编译:对源程序进行词法、语法分析,生成代码,优化等。作用:在编译之前,对源程序中的特殊命令做一些处理,生成扩展C源程序种类:宏定义 #define文件包含 #include条件编译 #if #else #endif等格式:“#”开头占单独书写行语句尾不加分号2)C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、宏定义

编译:对源程序进行词法、语法分析,生成代码,优化等。
作用:在编译之前,对源程序中的特殊命令做一些处理,生成扩展C源程序
种类:
宏定义 #define
文件包含 #include
条件编译 #if #else #endif等
格式:
“#”开头
占单独书写行
语句尾不加分号
在这里插入图片描述
2)C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。

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

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

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

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

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

#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 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形式:

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

在这里插入图片描述

二、“文件包含”处理

在这里插入图片描述

三、条件编译

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 深信服scsa知识点一「建议收藏」

    深信服scsa知识点一「建议收藏」1.AH51端口ESP50端口2.IPSEC能加密经过NAT转换的报文,但是不能验证经过NAT转换的报文,在穿越NAT时IKE协商的IP地址和端口不匹配3.非对称加密,使用其中一个密钥加密后只能使用另一个密钥解密4.加密和解密是对数据进行的某种交换,加密和解密的过程都在密钥的控制下完成的5.SANGFORVPN建立总部与分支的VPN类型,需要使用虚拟IP6.标准IPSEC中,启用DPD(对等体死亡检测)可以防止VPN隧道黑洞7.对于IPv4,IPSEC是可选的,对于IPv6,IPSEC是强

  • 查看linux执行的命令记录_linuxhistory命令

    查看linux执行的命令记录_linuxhistory命令前言我们每次敲打linux命令的时候,有时候想用之前用过的命令,一般情况下,我们都会按↑↓箭头来寻找历史的命令记录,那如果我想用1天前执行的某条命令,难道还要按↑100次?显示这样是不现实的,我们可

  • SpringBootTest无法启动

    SpringBootTest无法启动Suppressed:java.lang.IllegalStateException:Unabletofinda@SpringBootConfiguration,youneedtouse@ContextConfigurationor@SpringBootTest(classes=…)withyourtestatorg.springframework.util.Assert.state(Assert.java:76)解决方法将test目录与java目录保持一致,编译完成之

  • AOP【面向切面编程】「建议收藏」

    AOP【面向切面编程】「建议收藏」文章目录AOP介绍AOP术语AOP的实现方式AOP介绍AOP(AspectOrientedProgramming),即面向切面编程,可以说是OOP(ObjectOrientedProgramming),面向对象编程的补充和完善。  面向切面编程是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。常见的使用场景:日志事物数据库操作面向切面编程,…

    2022年10月26日
  • python中替换字符串中字符_Python replace()函数:替换字符串中的某个字符「建议收藏」

    python中替换字符串中字符_Python replace()函数:替换字符串中的某个字符「建议收藏」下面我们将通过一组示例,详细给大家说明下关于用python的替换问题,相信大家结合实例一定非常容易理解,一起来看下吧~基础了解——replace()函数语法:str.replace(old,new[,max])参数:old–将被替换的子字符串。new–新字符串,用于替换old子字符串。max–可选字符串,替换不超过max次。返回值:返回字符串中的old(旧字符串)替…

  • 深度学习 相机标定_相机标定

    深度学习 相机标定_相机标定术语内参矩阵:IntrinsicMatrix焦距:FocalLength主点:PrincipalPoint径向畸变:RadialDistortion切向畸变:TangentialDistortion旋转矩阵:RotationMatrices平移向量:TranslationVectors平均重投影误差:MeanReprojectionError重投影误差:Repr…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号