C语言#define的用法

news2025/1/8 4:54:00

#define 叫做宏定义命令,它也是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。

我们先通过一个例子来看一下 #define 的用法:

#include<stdio.h>

#define N 100

intmain(){
int sum =20+ N;
printf("%d\n", sum);
return0;
}

运行结果:

120

注意第 6 行代码int sum = 20 + N,N被100代替了。

#define N 100就是宏定义,N为宏名,100是宏的内容(宏所表示的字符串)。在预处理阶段,对程序中所有出现的“宏名”,预处理器都会用宏定义中的字符串去代换,这称为“宏替换”或“宏展开”。

宏定义是由源程序中的宏定义命令#define完成的,宏替换是由预处理程序完成的。

宏定义的一般形式为:

#define 宏名 字符串

#表示这是一条预处理命令,所有的预处理命令都以 # 开头。宏名是标识符的一种,命名规则和变量相同。字符串可以是数字、表达式、if 语句、函数等。

这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。

程序中反复使用的表达式就可以使用宏定义,例如:

#define M (n*n+3*n)

它的作用是指定标识符M来表示(y*y+3*y)这个表达式。在编写代码时,所有出现 (y*y+3*y) 的地方都可以用 M 来表示,而对源程序编译时,将先由预处理程序进行宏代替,即用 (y*y+3*y) 去替换所有的宏名 M,然后再进行编译。

将上面的例子补充完整:

#include<stdio.h>

#defineM(n*n+3*n)

intmain(){
int sum, n;
printf("Input a number: ");
scanf("%d",&n);
    sum =3*M+4*M+5*M;
printf("sum=%d\n", sum);
return0;
}

运行结果:

Input a number: 10
sum=1560

程序的开头首先定义了一个宏 M,它表示 (n*n+3*n) 这个表达式。在 9 行代码中使用了宏 M,预处理程序将它展开为下面的语句:

sum=3*(n*n+3*n)+4*(n*n+3*n)+5*(n*n+3*n);

需要注意的是,在宏定义中表达式(n*n+3*n)两边的括号不能少,否则在宏展开以后可能会产生歧义。下面是一个反面的例子:

#difine M n*n+3*n

在宏展开后将得到下述语句:

s=3*n*n+3*n+4*n*n+3*n+5*n*n+3*n;

这相当于:

3n2+3n+4n2+3n+5n2+3n

这显然是不正确的。所以进行宏定义时要注意,应该保证在宏替换之后不发生歧义。

对 #define 用法的几点说明

1) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单粗暴的替换。字符串中可以含任何字符,它可以是常数、表达式、if 语句、函数等,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。

2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起替换。

3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:

#define PI 3.14159

intmain(){
// Code
return0;
}

#undef PI

voidfunc(){
// Code
}

表示 PI 只在 main() 函数中有效,在 func() 中无效。

4) 代码中的宏名如果被引号包围,那么预处理程序不对其作宏代替,例如:

#include<stdio.h>
#define OK 100
intmain(){
printf("OK\n");
return0;
}

运行结果:

OK

该例中定义宏名 OK 表示 100,但在 printf 语句中 OK 被引号括起来,因此不作宏替换,而作为字符串处理。

5) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。例如:

#define PI 3.1415926
#define S PI*y*y /* PI是已定义的宏名*/

对语句:

printf("%f", S);

在宏代换后变为:

printf("%f", 3.1415926*y*y);

6) 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。

7) 可用宏定义表示数据类型,使书写方便。例如:

#define UINT unsigned int

在程序中可用 UINT 作变量说明:

UINT a, b;

应注意用宏定义表示数据类型和用 typedef 定义数据说明符的区别。宏定义只是简单的字符串替换,由预处理器来处理;而 typedef 是在编译阶段由编译器处理的,它并不是简单的字符串替换,而给原有的数据类型起一个新的名字,将它作为一种新的数据类型。

请看下面的例子:

#define PIN1 int *
typedef int *PIN2; //也可以写作typedef int (*PIN2);

从形式上看这两者相似, 但在实际使用中却不相同。

下面用 PIN1,PIN2 说明变量时就可以看出它们的区别:

PIN1 a, b;

在宏代换后变成:

int * a, b;

表示 a 是指向整型的指针变量,而 b 是整型变量。然而:

PIN2 a,b;

表示 a、b 都是指向整型的指针变量。因为 PIN2 是一个新的、完整的数据类型。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟只是简单的字符串替换。在使用时要格外小心,以避出错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring(九)】带你了解Spring整合MyBatis的详细过程

文章目录前言Spring整合mybatis思路分析Spring整合MyBatis总结前言 前面我们已经学习完了Spring的注解开发&#xff0c;接下来我们来学习Spring整合MyBatis&#x1f4aa;&#x1f4aa;。 Spring整合mybatis思路分析 整合其实我们在核心容器中已经完成了一个东西了:DruidDataSou…

Hue使用

文章目录HUE功能概览界面介绍Quick browseApp应用 App* 编辑器 【Editor】调度器 【Scheduler】浏览 Browsers*【Documents】【File Browser】HDFS【Job Browser】YARN、oozie【Table Browser】Hive、mysql、SQLite...【HBase Browser】HbaseHUE 在hue.ini 配置集成其他服务&a…

Doris-1.2.0安装部署详细流程

doris介绍 Doris是一个MPP的OLAP系统&#xff0c;以较低的成本提供在大数据集上的高性能分析和报表查询功能。 MPP (Massively Parallel Processing)&#xff0c;即大规模并行处理。简单来说&#xff0c;MPP是将任务并行的分散到多个服务器和节点上&#xff0c;在每个节点上计…

Power BI中创建父子层级二:父级单独产生值

一、父子层级 在数据分析中&#xff0c;经常会遇到父子层级问题&#xff0c;通常来说&#xff0c;父子层级又可以分为两种情况&#xff0c;一种为图1&#xff0c;江苏中烟的销量就是南京品牌和苏烟品牌的销量之和&#xff0c;南京品牌的销量就是南京&#xff08;硬红&#xff…

cocos开发微信小游戏ci机器人实践

1.cocos使用命令行发布微信小游戏项目 1.1 先编辑微信小游戏构建发布配置&#xff0c;然后导出配置&#xff0c;会生成一个buildConfig_wechatgame.json的配置文件 1.2 使用命令行构建微信小游戏项目 D:\CocosDashboard\resources.editors\Creator\3.4.2\CocosCreator.exe --…

硅烷试剂1873-77-4_Tris(trimethylsilyl)silane_三(三甲基硅基)硅烷

●中文名&#xff1a;三(三甲基硅基)硅烷&#xff0c;三(三甲硅基)硅烷●英文名&#xff1a;TRIS(TRIMETHYLSILYL)SILANE&#xff0c;Tris&#xff08;trimethylsilyl&#xff09;Silane&#xff0c;Tris(trimethylsilyl)silaneTris(trimethylsilyl)silane中含有硅烷基&#xf…

JavaScript 中清空数组的几种方法

目录 Array.prototype.splice() 将 length 设置为 0 分配新的空数组 length 0和 Array [] 之间的差异&#xff1f; JavaScript 中清空数组的几种方法多少人都想走出浪浪山 &#x1f9e8;&#x1f9e8;&#x1f9e8; Array.prototype.splice() let course [HTML, CSS, Java…

第四章.神经网络—线性神经网络,Delta学习规则

第四章.神经网络 4.2 线性神经网络与Delta学习规则 线性神经网络在结构上与感知器非常相似&#xff0c;只是激活函数不同。在模型训练时把原来的sign函数改成purelin函数:y x 1.激活函数 2.线性神经网络示例 1).题目&#xff1a; 假设平面坐标系上有四个点&#xff0c;(3,3)…

基于python的二手房数据分析,思路+代码范例

本篇博客将基于 Python &#xff0c;梳理二手房数据分析的整体过程。 文章目录思路整理数据分析步骤的示例代码基于 Python 的二手房分析 | 另一种代码思路整理 数据收集&#xff1a;从网站或其他数据源收集二手房数据&#xff0c;并将其存储在 CSV 或其他数据格式中。数据清洗…

Python连接Liunx中mysql数据库-多表查询【10个经典案例】

关于Python连接liunx中mysql数据库的方式在这一篇文章 Python连接Liunx中mysql数据库-保姆级教程 关于Python针对liunx中的mysql数据库进行增删改查操作的文章在这一篇可以看一下 Python连接Liunx中mysql数据库-增删改查 对于单表查询的学习可以看这一篇文章 Python对liunx中my…

帆软FineReport 实现省市区树形联动

在项目数据展示中&#xff0c;涉及到行政区划&#xff0c;省市区三级联动&#xff0c;运用帆软FineReport该如何实现&#xff0c;记录下来&#xff0c;方便备查。 第一步、树形数据准备 行政区划主要分为三级&#xff0c;即省市区&#xff0c;特殊的包含四个直辖市&#xff0…

【人机交互】COMP5517 HCI 课程笔记

人机交互Class 1: Overview of Human Computer Interaction人机交互的目标What does HCI involveClass 1 ContentImportance of HCISteps of HCISome HCI ProductsClass 1: Overview of Human Computer Interaction 人机交互的目标 Methods for grounding the design in real…

Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jan 2023)

Windows 11, version 22H2&#xff0c;2023 年 1 月 更新&#xff0c;持续更新中… 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 最新发布 &#x1f449…

分布式session

目录 1.什么是session 2.session共享问题 2.1.session复制同步 2.2.存在客户端 2.3.一致性hash 2.4.统一存储 1.什么是session HTTP是无状态的&#xff0c;session是一种会话保持技术&#xff0c;目的就是以一种方式来记录http请求之间需要传递、交互的数据。 不是每次…

vite配置CDN和文件压缩

例子,vue3导入element-plus 打包大小 1.加载插件cdn-import yarn add vite-plugin-cdn-import -D 2.配置vite vite.config.js import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import { autoComplete, Plugin as importTo…

PPI数据集示例项目学习图神经网络

目录PPI数据集&#xff1a;算法原理&#xff1a;代码实现&#xff1a;训练过程PPI数据集&#xff1a; 参考&#xff1a;https://blog.csdn.net/weixin_43580130/article/details/116449062 PPI(生物化学结构) 网络是蛋白质相互作用&#xff08;Protein-Protein Interaction,P…

若依配置教程(四)代码生成

文章目录一、在数据库中新建表&#xff08;代码生成的数据表&#xff09;二、打开若依系统&#xff0c;进入代码生成界面三、编辑字段和基本信息四、解压文件夹&#xff0c;放到相关目录一、在数据库中新建表&#xff08;代码生成的数据表&#xff09; 建议在表中必须加的字段…

通信原理笔记—脉冲编码调制(PCM)

目录 脉冲编码调制(PCM)&#xff1a; PCM概念&#xff1a; A、μ律的PCM编码&#xff1a; A律对数压缩特性的十三折线法近似&#xff1a; A律正输入值编码表&#xff1a; A、μ率的PCM编码方法&#xff1a; A 率的PCM译码方法&#xff1a; 脉冲编码调制(PCM)&#xff1a;…

VUE 中项目启动没有问题,代码中 script 标签有蓝色波浪线标注

项目场景&#xff1a; VUE 中项目启动没有问题&#xff0c;代码中 script 标签有蓝色波浪线标注&#xff1a; 并且有相关的 提示信息 Virtual script not found, may missing &#xff1c;script lang“ts“&#xff1e; / “allowJs“: true / jsconfig.json.volar 问题描述…

ESP32设备驱动-Si7021温度传感器驱动

Si7021温度传感器驱动 文章目录 Si7021温度传感器驱动1、Si7021介绍2、硬件准备3、软件准备4、驱动实现1、Si7021介绍 Si7021 I2C 湿度和温度传感器是一款集成了湿度和温度传感器元件、模数转换器、信号处理、校准数据和 I2C 接口的单片 CMOS IC。 Si7021 提供精确、低功耗、工…