C语言系列-预定义符号&#define定义宏&#define定义宏

这篇具有很好参考价值的文章主要介绍了C语言系列-预定义符号&#define定义宏&#define定义宏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言系列-预定义符号&#define定义宏&#define定义宏,c语言,开发语言

 🌈个人主页: 会编辑的果子君

💫个人格言:“成为自己未来的主人~”  

C语言系列-预定义符号&#define定义宏&#define定义宏,c语言,开发语言

目录

预定义符号

#define定义常量

#define定义宏


预定义符号

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。

__FILE__   //进行编译的源文件
	__LINE__   //文件当前的行号
	__DATE__   //文件被编译的日期
	__TIME__   //文件被编译的时间
	__STDC__   //如果编译器遵循ANSIC,其值为1,否则未定义

举个例子:

 文章来源地址https://www.toymoban.com/news/detail-832814.html

#include<stdio.h>
int main()
{
	//__FILE__   //进行编译的源文件
	//__LINE__   //文件当前的行号
	//__DATE__   //文件被编译的日期
	//__TIME__   //文件被编译的时间
	//__STDC__   //如果编译器遵循ANSIC,其值为1,否则未定义

	printf("%d,%s", __LINE__, __DATE__);
	return 0;
}

#define定义常量

基本语法:

#define name stuff

举个例子:

 

#define name stuff
#define MAX 100
#define reg register
#define forever for(;;)
#define case break;case
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
		 date:%s\ttime:%s\n" ,\
		 __FILE__,__LINE__ 

 思考:在define定义标识符的时候,要不要在最后加上;?

例如:

#define MAX 100;
#define MAX 100

建议不要加上;,这样容易导致问题

比如下面的场景:

if (condition)
max = MAX;
else
max = 0;

如果是加了分号的情况,等替换后,if 和 else之间就是2条语句,而没有大括号的时候,if后边只能有一条语句,这里会出现语法错误

#define定义宏

#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)

下面是宏的申明方式:

#define name( parament-list) stuff

其中的parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中

注意:

参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分

举例:

#define SQUARE(x) x*x

这个宏接收一个参数x,如果在上述声明之后,你把SQUARE(5); 置于程序中,预处理器就会用下面这个表达式替换上面的表达式:5*5

警告:

这个宏存在一个问题:

观察下面的代码段:

#define SQUARE(x) x*x
#include<stdio.h>
int main()
{
	int a = 5;
	printf("%d\n", SQUARE(a + 1));


	return 0;
}

乍一看,你可能觉得这段代码将打印36,事实上它将打印11,为什么呢?

替换文本时,参数x被替换成a+1,所以这条语句实际上变成了:

printf("%d\n", a + 1 * a + 1);

这样就比较清晰了,由替换产生的表达式并没有按照预想的次序来求值

在宏定义上加上两个括号,这个问题便轻松的解决了:

#define SQUARE(x) (x)*(x)

这样预处理之后就产生了预期的结果:

printf("%d\n", (a + 1)* (a + 1));

这里还有一个宏定义:

#define SQUARE(x) (x)+(x)

定义中我们使用了括号,想避免之前的问题,但是这个宏可能会出现新的问题

#define SQUARE(x) (x)+(x)
#include<stdio.h>
int main()
{
	int a = 5;
	printf("%d\n", 10 * SQUARE(5));

	return 0;
}

这将打印什么呢,看上去,好像打印100,但是事实上打印的是55,

我们发现替换之后:

printf("%d\n", 10 * (5) + (5));

乘法运算先于宏定义的加法,所以出现了55

这个问题的解决办法是在宏定义表达式两边加上一对括号就可以了。

#define SQUARE(x) ((x)+(x))

提示:

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

C语言系列-预定义符号&#define定义宏&#define定义宏,c语言,开发语言

C语言系列-预定义符号&#define定义宏&#define定义宏,c语言,开发语言 

 

 

 

 

 

 

 

 

 

到了这里,关于C语言系列-预定义符号&#define定义宏&#define定义宏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SWAT】SWAT中预定义河网及流域

    平原圩区没有明显的海拔差异。DEM中包含的地形信息无法定义河段的位置和水文连接,SWAT模型Watershed Delineator中提供两种方法,帮助用户输入流域拓扑信息。第一种方法,“Burn-in”和手动绘制河段和子流域边界。首先,使用“Burn-in”功能导入数字河道网络(DCN),并根据D

    2024年01月19日
    浏览(70)
  • Matlab高效编程:向量化(vectorization)、矩阵化、变量预定义

    目录 0. 前言 1. 变量预定义 2. 向量化,vectorization 3. 矩阵化 3.1 离散化 3.2 双重循环实现 3.3 向量化实现 3.4 矩阵化实现         本文介绍几个Matlab常用的提高运行效率的编程技巧。         对一个基于数值化的方式计算一个连续函数的频谱(傅里叶变换)的例子给出了三种实

    2024年02月02日
    浏览(51)
  • 预定义类型“System.*****“未定义或未导入,且dll全部带有黄色感叹号

    一不小心动了vs的源文件 Microsoft.Common.CurrentVersion.targets,导致引发了System下所有的方法如Object,Void等不可用,dll带有感叹号 刚开始不知道是源文件的错误,搜索到了好几种解决方法,有: 1.可能是dll的框架和项目框架不一致,打开项目属性,更改目标框架后重新生成并重启

    2024年02月04日
    浏览(46)
  • JavaScript保留字和预定义的全局变量及函数汇总

    保留字也称,每种语言中都有该语言本身规定的一些,这些都是该语言的语法实现基础,JavaScript中规定了一些标识符作为现行版本的或者将来版本中可能会用到的,所以当我们定义标识符时就不能使用这些了,下面介绍下JavaScript保留

    2024年01月16日
    浏览(60)
  • 在 QML 中,ComboBox 是一种常用的用户界面控件,通常用于提供一个下拉式的选择框,允许用户从预定义的选项列表中选择一个值

    ComboBox 详解: 以下是 ComboBox 的一些重要属性和特性: model : 用于指定 ComboBox 中的选项列表,可以是一个数组、列表、模型或者其他可迭代的数据结构。 editable : 用于指定是否允许用户编辑 ComboBox 中的文本输入框,以便输入非预定义的选项。 currentIndex : 用于获取或设置当前

    2024年04月15日
    浏览(44)
  • 【C语言】#define 宏定义初步使用

    使用宏定义可以防止出错,提高可移植性,可读性,方便性等。 下面列举了一些成熟软件中常用的宏定义。 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植: typedef unsigned char boolean; /* Boolean value type. / typedef unsigned long int uint32;

    2024年02月10日
    浏览(39)
  • C 语言中宏定义中指定数据类型, U、L、F等符号含义

    一、引言 代码中可以直接定义一个变量是可以指定变量数据类型,宏定义中也可以实现数据量类型的指定。 现在我们定义一个宏变量#define NUM 5,这个数字5是以什么类型存储的呢?答案是signed int。我们再这样定义一个宏变量#define NUM 5LL,此时的数字5又是以什么类型存储的呢

    2024年02月15日
    浏览(44)
  • 【开源】基于JAVA语言的民宿预定管理系统

    基于JAVA+Vue+SpringBoot+MySQL的民宿预定管理系统,包含了民宿档案模块、民宿订单模块、民宿评价模块、民宿留言模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,民宿预定管理系统基于角色的访问

    2024年01月22日
    浏览(50)
  • 「C/C++」C/C++宏定义#define

    ✨博客主页 何曾参静谧的博客 📌文章专栏 「C/C++」C/C++程序设计 📚全部专栏 「UG/NX」NX二次开发 「UG/NX」BlockUI集合 「VS」Visual Studio 「QT」QT5程序设计 「C/C++」C/C++程序设计 「Win」Windows程序设计 「算法」数据结构与算法 「File」数据文件格式 @[TOC](目录) *** # 术语说明 `定义

    2024年02月16日
    浏览(38)
  • 【车载开发系列】UDS诊断---动态定义DID($0x2C)

    动态定义数据标识符 DynamicallyDefineDataIdentifier(2Ch) 此服务允许诊断工具在ECU的内部动态定义一个数据标识符,一个临时的DID,可以通过这个DID读取一段内存的数据,也可以通过改DID一次性读取多个原有DID的数据。 该数据标识符还可以被读取数据服务22h或读取数据(周期标识

    2024年02月02日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包