宏定义(超级详细)

宏定义在编程里面也有十分重要的作用,下面我就来详细介绍一下:

宏的特点

宏主要特点是它在预编译的时候就会被数字或者代码字符替换掉。这样可以将一些重复的变量替换掉,方便我们进行修改,只需要修改宏定义就行了。

宏的几大类

预定义符号

预定义符号也是在预处理的时候替换掉,主要有以下几个:

这相当于提前用define定义好的宏。我们可以直接使用。

那么都有一些什么作用呢,时间月份文件地方这些就不用说了。我们看看行号有什么用

当发生运行错误的时候我们程序提前退出了但是并不知道具体在哪一行有问题,那么这时的__LINE__就发挥作用了;

define

define是我们比较熟悉的宏定义。

宏定义表达式

如下是宏定义了两个数字和一个加法。

那么结果是否就是121呢?

为什么不是呢?

因为宏定义在预编译的时候就只是替换了符号,再进行计算。我们将替换后的结果看看:

      

替换后一目了然,先进行了乘法再进行了加法。所以答案是29。

解决办法也很简单,就是在定义宏的时候,提前加上括号保证计算的优先级在不同的宏替换下是一样的

define除了构建这种简单的表达式,还可以干什么呢?我们接着往下看

重复使用的代码

在此之前我们要了解一个东西:

宏的数据传入

类似于函数,我们的宏也可以进行数据的传入,但是不仅可以传数据,也可以传入一个符号。

下面的就是传入数据还有设置一个符号x来当做变量。

我们在写一些for循环的时候,经常会写到for(int x=0;x<len;++x)那么我们是否可以像函数那样用define来宏定义一下呢?

这个我很推荐大家用,很方便,省时间。

定义函数

在讲定义函数的前提下,我们还要知道define的一些语法:

/接行符

我们define只允许一行,如果我们要弄成几行,我们就用/这样我们可以既方便看代码(全写在一行不好看代码逻辑),最后也不会报错。

#将变量变成字符

##将两个字符连接到一起

这个我同上面结合一起讲

比如我们要定义一个可以自己选择的打印函数,一个值是变量,另一个是打印的类型.

#undef

用来取消一个宏定义,这一行之后就不能再用被取消的宏了。

条件宏

#ifdef  -  #endif

补全单词就是if define  end if,表示如果定义了什么就会执行下面的代码,然后在end if之前终止

#if 常量表达式  -#elif  -   #else   -  #endf

这个和我们的if - else if -else是一样的,而且支持嵌套条件宏。

而且也可以拆解:#if - #endif     或者    #if - #else - #endif     #if - #elif - #endif  都是可以的

我们发现不会执行的代码会变浅,这种也是可以当注释用的,而且似乎比注释成绿色的更好看的清。这里如果是不用了的代码就可以用绿色注释法,如果可能后面还要用就用井号注释法

头文件的包含

<>和""

头文件的包含也是宏定义的一种。其中头文件的包含包括两种,一种是""另一种是<>。那么他们有什么不同呢?

<>是直接在标准库里面找头文件,而""是先在外部文件里面找你写的头文件,如果没找到再标准库里面找头文件。

因此我们如果是引用标准库的文件用<>最好,防止用""查找两次。

头文件的嵌套包含

头文件的嵌套包含是有问题的,可能同一段代码出现了两次,可能导致变量的重定义。因此我们有两种方法来避免这种情况的发生。

第一种是:

#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif

第二种是:

#pragma once   推荐第二种

命名约定

我们定义宏一般全部大写,定义函数的时候小写居多。这样方便区分。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《一》Qt的概述

1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 1.2 Qt的发展史 1991年 Qt最早由芬兰奇趣科技开发 1996年 进入商业领域&#x…

2024年mathorcup(妈妈杯)数学建模C题思路-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

matlab conv2

MATLAB卷积conv、conv2、convn详解-CSDN博客

全面学习SpringCloud框架指南

要深入学习Spring Cloud框架,你需要系统地掌握其核心组件和概念,并了解如何在实际项目中应用这些知识。以下是一些关键的学习点和相应的学习内容: 一共分为10个模块包括: 1、微服务架构基础: 理解微服务架构的概念和优势。 学习单体架构向微服务架构演进的过程。 掌握…

IE浏览器清理缓存工具

有些项目可能因为浏览器缓存导致使用异常&#xff0c;比如登陆异常。这里提供清除浏览器痕迹的工具&#xff0c;以IE浏览器为例&#xff0c;痕迹的默认存放位置为&#xff1a; C:\Users\Ro\AppData\Local\Microsoft\Windows\Temporary Internet Files 新建bat或者cmd批处理文件…

【LeetCode热题100】189. 轮转数组(数组)

一.题目要求 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 二.题目难度 中等 三.输入样例 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: …

【学习】企业做等保测评有何意义

等保测评是指对信息系统的安全性进行评估和保障的一种标准&#xff0c;其全称为“信息安全等级保护测评”。随着信息技术的不断发展和应用&#xff0c;信息安全问题越来越受到人们的关注。为了保障信息系统的安全&#xff0c;国家制定了一系列的安全等级保护标准&#xff0c;而…

【优选算法专栏】专题四:前缀和(二)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

gitee上传出现git did not exit cleanly (exit code 1)的错误

在最后push的时候出现下面的结果&#xff1a; 出现这个错误的原因有好多种&#xff0c;目前介绍博主遇到的两种&#xff1a; 在第一次进行push操作的时候&#xff0c;需要输入用户名和密码&#xff0c;如果输入错误&#xff0c;则最后可能会出现上述报错 解决方法&#xff1a;…

智慧InSAR专题———模拟数据实现现实场景异常形变点识别(项目讲解)

续上篇 文章目录 &#xff08;一项技术的复现&#xff0c;我们应该有打破砂锅问到底的态度&#xff0c;我找到了这篇文章的一些灵感来源&#xff0c;包括算法和编程以及专业知识等&#xff0c;对我而言也是受益匪浅&#xff09;1. 数据准备1.1 A deep learning approach to de…

基于STM32F103单片机的时间同步项目

一、前言 本项目为前一个时间同步项目的更迭版本,由于之前的G031开发板没有外部晶振,从机守时能力几乎没有,5秒以上不同步从机时间就开始飞了。在考虑成本选型后,选择了带有外部有缘晶振的STM32F103C8T6最小单片机,来作为本次项目的开发平台。 G031时间同步链接: 基于ST…

mui和uniapp跳转外部链接

Hbuilder开发的app&#xff0c;会涉及到跳转H5页面 mui <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"initial-scale1.0, maximum-scale1.0, user-scalableno" /><link …

windows下安装yolov8环境(详细图文教程)

目录 一&#xff1a;前言 二&#xff1a;安装yolov8 一&#xff1a;前言 最近看了 YOLO 的发展史&#xff0c;发现在机器视觉领域的应用非常广泛&#xff0c;f刚好最近一直在做机器视觉的工作&#xff0c;特此记录下搭建yolov的环境。我们使用的版本是yolov8的就用这个作为演…

大小端、结构体对齐

目录 王道ppt总结&#xff1a;​编辑 个人理解&#xff1a; 相关文章&#xff1a; 王道ppt总结&#xff1a; 个人理解&#xff1a; 机器的读取数据的顺序&#xff1a;都是从低地址开始。 为什么&#xff1f;假如进行一个加法计算&#xff0c;肯定是从最低位开始&#xff0c…

spring eureka 服务实例实现快速下线快速感知快速刷新配置解析

背景 默认的Spring Eureka服务器&#xff0c;服务提供者和服务调用者配置不够灵敏&#xff0c;总是服务提供者在停掉很久之后&#xff0c;服务调用者很长时间并没有感知到变化。或者是服务已经注册上去了&#xff0c;但是服务调用方很长时间还是调用不到&#xff0c;发现不了这…

apline安装redisjson

安装前的说明 由于redis现在下载redisjson很繁琐&#xff0c;还可能需要科学上网&#xff0c;只能自己编译了 系统是apline&#xff0c; 为什么是这个系统&#xff1f;原因是docker安装redis是用了这个系统 下载地址,按照实际情况选择&#xff0c;如果不行就老老实实自己编译吧…

ESP8266开发

1esp8266Wifi连接,通过手机控制点灯 1.下载Arduino,编程 2.下载blinker手机APP。 3.下载blinker库。https://arduino.me/s/blinker-arduino?aid=711 4.打开编程工具 Arduino,加载blinker库 5. 打开库里面的例程,基于例程开发。 blinker-library-0.3.10230510\blinker-…

数据同步工具datax配置与示例

文章目录 前言一、部署步骤1、jdk环境2、python环境步骤一&#xff1a;安装方式一&#xff1a;官网下载安装包方式二&#xff1a;brew命令安装 步骤二&#xff1a;配置环境变量步骤三&#xff1a;验证 3、maven环境&#xff08;可选&#xff09; 二、下载安装datax1、下载datax…

C语言完结篇(17)

编译和链接 1. 翻译环境和运⾏环境 2. 翻译环境&#xff1a;预编译编译汇编链接 我们知道计算机能够执行的是二进制的指令 而我们的C语言代码都是文本信息 所以我们需要让C语言代码转变为二进制的指令&#xff08;这是需要编译器来进行处理的&#xff09; 翻译环境和运⾏…

SpringBoot启动流程分析之准备应用上下文refreshContext()

文章目录 源码入口1、准备刷新1.1、子类prepareRefresh()方法1.2 父类prepareRefresh&#xff08;&#xff09;方法 2、通知子类刷新内部bean工厂3、准备bean工厂4、允许上下文子类对bean工厂进行后置处理 源码入口 org.springframework.boot.SpringApplication#run(java.lang…