C语言进阶——4.宏定义

2023-11-06

C语言进阶——4.宏定义

1. 宏定义是什么?

宏是用来表示一段代码的标识符。

宏也是标识符,也要满足标识符的规则。但通常习惯使用大写字母和下划线命名。

2. 宏定义怎么用?

宏定义通常有三种用法:

  1. 当作常量使用。
  2. 当作函数使用。
  3. 编译预处理。
2.1 宏定义常量
2.1.1 预定义宏

ANSI C标准定义有些定义好的宏定义,称为预定义宏。这些宏定义以双下划线__开头结尾。

在这里插入图片描述

  • 示例
printf("%s:%d",__FILE__,__LINE__);
printf("%s:%s",__DATE__,__TIME__);
2.1.2 自定义宏

除了使用标准定义的宏,可以使用#define指令用来定义一个宏。

  • 语法
#define 标识符 值
  • 示例
#define PI 3.1415926

说明

  • 注意没有结尾的分号,因为不是C的语句。
  • 名字必须是一个单词,值可以是各种东西。
  • 在C语言的编译器开始之前,编译预处理程序会把程序中的名字换成值。是完全的文本替换。
  • 如果一个宏的值有其他宏的名字,也会被替换。
#define PI_2 2*PI
  • 如果一个宏的值超过一行,最后一行之前行末需要加\。
#define PI_2 2 \
             * \
             PI
  • 宏的值后面出现的注释不会被当做宏的值的一部分。
#define PI_2 2*PI  // 二倍的PI
2.2 带参数的宏

宏可以带参数,使用上有些像函数。这种宏称为带参数的宏。

  • 语法
#define 标识符(参数...) 代码
  • 示例
#define square(x) ((x)*(x))
#define cube(x) ((x)*(x)*(x))
  • 试一试
    是否可以不带括号?
#define square(x) x*x
#define cube(x) x*x*x

square(10);
cube(10);
square(10+1);
cube(10+1);

说明

  • 上面因为缺少括号导致错误,称为宏定义边际效应,所以带参数的宏需要在一下两个位置加上括号:

    1. 参数出现的每个地方都要加括号。
    2. 整个值要加括号。
  • 参数的宏也可以有多个参数

#define MIN(a,b) ((a)<(b)?(a):(b))

尽量避免使用宏定义。

2.3 编译预处理

有时我们会使用没有值的宏,这种宏用于条件编译的,#ifdef #ifndef用于检查宏是否被定义过。控制代码的编译。

#define _DEBUG
  • 示例
#ifdef TEST
    printf("Test\n");
#else
    printf("No Test\n");
#endif
3. 宏展开

宏的本质是指编译前(编译预处理阶段),用定义中的值或者代码完全替换宏的标识符。

在这里插入图片描述

gcc中可以使用-E或者--save-temps,查看替换后的结果。

4. 编译预处理指令

#开头的都是编译预处理指令。除了宏定义,还有文件包含#include和条件编译指令#if#ifdef #ifndef#else#elif

  • 文件包含#include
    把文件内容包含到代码中
  • 条件编译指令#if#ifdef #ifndef#else#elif
    根据编译条件,选择编译或者编译某段代码。

编译预处理指令不是C语言的成分,但是C语言程序离不开它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言进阶——4.宏定义 的相关文章

  • [1022]Hive insert 字段表错位

    文章目录 Hive insert 字段表错位踩坑 1 问题描述 2 排查过程 3 问题定位 4 解决方案 hive的insert语句列顺序问题以及新增字段遇到的坑 insert语句列顺序 对新增字段插入数据再查询发现是NULL Hive i
  • 技术管理主要做什么?

    最近一直在思考技术转管理过程中需要注意到的一些事情 现在就总结下分享给大家看看 核心职责 确定团队目标 不论项目大小 一定要有目标 有目标才能让所有人看到方向 明确每天工作的意义 单纯技术人员应该切换思维为全局性 而不局限于技术层面 现在个
  • 某盾滑块js逆向

    注 本篇博客仅供学习使用 请勿用做其他商业用途 如有侵权 请联系本菜鸟删除 本小菜鸟已经快两个月没更新文章了 一年总有那么356天不想努力 就想躺平 最开始学习js逆向的时候 用Python算法还原了某盾的空间推理 到现在已经过去半年多 这
  • Mybaties-plus 分页使用

    1 简介 查询分页分为物理分页和逻辑分页 1 逻辑分页 一次性查出所有数据 然后在内存中筛选需要的数据 缺点 大数据量时容易造成内存溢出 因为是一次性查出每次返回需要的所有数据时效性低不推荐使用 2 物理分页 通过sql 的limit 去控
  • 联想小新Pro14安装Ubuntu后无法进入系统、亮度无法调节、蓝牙无法打开、输入卡顿延迟等问题的解决办法

    联想小新Pro14安装Ubuntu后无法进入系统 亮度无法调节 蓝牙无法打开等问题的解决办法 前言 月初买了台联想小新Pro14 AMD锐龙5800H版本 在安装Ubuntu 20 04 2 LTS 系统时遇到了一些问题 所幸在众多网友前辈
  • Fetch&Fetch的二次封装

    前言 客户端服务器端通信方式ajax ajax JQ的类库 axios类库 jsonp fetch fetch是Es6新提供的API 基于不同于 XMLHttpRequest的方式 基于客户端和服务器端的数据通信 而且本身是基于promis

随机推荐

  • 数据预测分析

    数据预测分析 Matlab实现TCN时间卷积网络数据预测分析 目录 数据预测分析 Matlab实现TCN时间卷积网络数据预测分析 基本介绍 数据下载 程序设计 参考资料 致谢 基本介绍 此示例说明如何使用通用时间卷积网络 TCN 对序列数据
  • 南邮NOJ上机系统#PROB1005涂色问题

    涂色问题 描述 这是一个涂色问题 现在有一张网格 一共 3 行 每行 n 个 你需要用 3 种颜色给网格上色 需要确保相邻格子颜色不同 请问一共有多少种上色方案呢 答案对 109 7 取模 输入 一行一个整数 n 1 n 106 输出 一行
  • spring学习记录笔记-AOP 通知的五大注解详解

    印象云笔记记录 提供链接 点我打开笔记
  • python3中TypeError: data type not understood的解决方法X_b = np.hstack([np.ones((len(x), 1)), x.reshape(-1,

    学习6 4 实现线性回归中的梯度下降法时 在JupterNotebook中按照教程来完全没有问题 但是在pycharm中封装这个方法时 def fit gd self X train y train eta 0 01 n iters 1e4
  • 【动手学习深度学习v2】循环神经网络-2.文本预处理

    上一篇 动手学深度学习V2 循环神经网络 1 序列模型 文章目录 2 文本预处理 2 1 读取数据集 2 2 词元化 2 3 词表 2 4 整合 2 文本预处理 序列数据的多种形式中 文本数据是最常见的一种 在英文文本中一篇文章或者一段句子
  • C++中类似于Integer.MAX_VALUE的INT_MAX表示

    要想使用需要添加头文件 include
  • Maven下载依赖踩坑:Could not transfer artifact org.springframework.boot:spring-boot-starter-parent

    环境 IDEA 公司办公环境 本文只适用于启用了代理服务进行联网的情况 非此情况的朋友们还请另找原因 创建工程后spring boot starter parent等依赖标红 因为对应的依赖找不到 下载时报错误 Could not tran
  • Unity学习之性能分析

    Unity 提供的性能分析工具 Unity Profiler 测量 Unity 编辑器 您的应用程序在运行模式下 或在开发模式下连接到设备运行时的性能 Profiling Core 包 提供的 API 可用于将上下文信息添加到 Unity
  • Python获取各大企业招聘需求以及可视化分析展示

    前言 大家早好 午好 晚好吖 欢迎光临本文章 课程亮点 1 爬虫的基本流程 2 可视化分析展示 3 requests模块的使用 4 保存csv 开发环境 python 3 8 运行代码 pycharm 2022 3 2 辅助敲代码 专业版
  • antd table表格组件基本使用

    第一次使用antd的table表格组件 借用官方文档数据 展示下Demo import React from react import Table from antd const columns title Name dataIndex n
  • 全国计算机等级考试二级C语言考试学习笔记

    1 C语言程序的结构 1 1 程序的构成 main函数和其他函数 1 1 1 main函数 一个完整的C语言程序 是由一个 且只能有一个main 函数 又称主函数 必须有 和若干个其他函数结合而成 可选 main函数是C语言程序的入口 程序
  • 药监局网瑞数绕过与反爬学习

    药监局瑞数反爬学习 贴逆向好的js代码 剩下靠你们自己了 需要返回cookie 否则无限跳转 文件夹中带有nginx静态服务配置 使用nginx后 并在hosts中添加一行app1 nmpa gov cn 你nginx的ip 浏览器访问ht
  • 原生js实现对select下拉列表的内容过滤

    原生js实现对select下拉列表的内容过滤 场景描述 笔者在工作的过程中 经常碰到这样的业务场景 客户要求一个下拉列表框旁边要有一个输入过滤的功能 如下图所示 由于在一个项目中出现了好多这样的需求 笔者就写了个采用原生js实现的对下拉的过
  • 决策树(Decision Tree)

    Author xiaoran Email PursuitFlow 163 com xiaoranone 126 com Datawhale 简介和算法 决策树是机器学习最常用的算法之一 它将算法组织成一颗树的形式 其实这就是将平时所说的if
  • Kompose使用

    参考网址 https kubernetes io docs tools kompose user guide Kompose是一个转换工具 可以将docker compose编排docker compose yaml文件转换为kuberne
  • osgEarth的Rex引擎原理分析(一二九)地图下载器实现原理

    目标 七十二 中问题148 java版本 String iPath http online2 map bdimg com tile qt tile x 4 y 4 z 5 styles pl udt 20171031 scaler 1 p
  • 免费的crm系统部署在自己的服务器,CRM软件的三种部署方式

    企业部署CRM软件有三种不同选择 他们在成本 风险和利益上各有不同 本文将逐一介绍这三类CRM部署方式 本地部署 软件托管和服务器代管 软件即服务 一 CRM本地部署方式 这是将软件客户端 服务器部署在客户本地服务器的一种方式 这种方式为客
  • 神经网络学习小记录63——Keras 图像处理中注意力机制的代码详解与应用

    神经网络学习小记录63 Keras 图像处理中注意力机制的解析与代码详解 学习前言 什么是注意力机制 代码下载 注意力机制的实现方式 1 SENet的实现 2 CBAM的实现 3 ECA的实现 注意力机制的应用 学习前言 注意力机制是一个非
  • 關於 React 中的 Hooks - 完全上手指南

    關於 React 中的 Hooks 完全上手指南 前言 正文 什麼是 Hooks useState 自定義 Hooks useEffect useRef useLayoutEffect useCallback useMemo useRedu
  • C语言进阶——4.宏定义

    C语言进阶 4 宏定义 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也是标识符 也要满足标识符的规则 但通常习惯使用大写字母和下划线命名 2 宏定义怎么用 宏定义通常有三种用法 当作常量使用 当作函数使用 编译预处理 2 1 宏定义常