宏预处理器的非直译解释备忘

非直译解释:

计算机科学里的宏指的是,在未执行程序运算前,预先把数据存入内存生成一张存有数据的表格结构体,以方便汇编机器指令读取修改表格地址中的数据参数。

macro

n.宏指令;
adj.巨大的;极厚的;特别突出的;大量使用的;

宏(英语:Macro)是一种批量处理的称谓。

计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。

计算机语言中宏构想的应用

头文件和预处理器指令:C语言中的宏

头文件和预处理器指令是C语言中非常重要的概念,它们可以帮助我们在程序中引用其他代码文件、定义常量和宏、进行条件编译等操作。其中,宏是一种基于预处理器指令的编程工具,它可以将一段代码定义为一个宏,并在程序中多次调用,以达到简化代码、提高效率等目的。下面将分别介绍头文件和预处理器指令的相关知识,并详细阐述宏的使用方法和注意事项。

一、头文件

头文件是一种代码文件,用于包含其他代码文件中的函数原型、变量声明、类型定义等信息,并在程序中引用这些信息。头文件一般具有.h的后缀名。

在使用头文件时,我们需要使用#include指令将其包含到程序中。例如,要在程序中引用<stdio.h>头文件中的printf函数,可以使用如下代码:


#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}

在上述代码中,我们使用#include指令将stdio.h头文件包含到程序中,并使用其中的printf函数。

二、预处理器指令

预处理器指令是一种特殊的指令,用于告诉编译器在编译程序之前进行某些操作,例如宏定义、条件编译等。预处理器指令一般使用#开头,并且必须出现在源码的最开始位置。下面是一些常用的预处理器指令:

  1. #define

#define指令用于定义宏,例如:


#define PI 3.1415926

在上述代码中,我们使用#define指令将PI定义为一个宏,并将其值设置为3.1415926。在程序中,我们可以直接使用PI来代表这个值。

  1. #ifdef / #ifndef / #endif

#ifdef指令用于判断某个符号是否已经被定义,例如:


#ifdef DEBUGprintf("Debug mode.\n");#endif

在上述代码中,我们使用#ifdef指令来判断DEBUG符号是否已经被定义,并在其被定义时输出调试模式信息。

#ifndef指令与#ifdef指令相反,用于判断某个符号是否未被定义。#endif指令用于结束#ifdef或#ifndef块。

  1. #include

#include指令用于包含其他代码文件、头文件等,例如:


#include "myheader.h"

在上述代码中,我们使用#include指令包含名为myheader.h的头文件。

三、宏

宏是一种基于预处理器指令的编程工具,它可以将一段代码定义为一个宏,并在程序中多次调用,以达到简化代码、提高效率等目的。宏的定义格式为:


#define macro_name(value) code

其中,macro_name表示宏的名称,value表示宏的参数,code表示宏的代码。

下面是一个将两个数相加的宏定义示例:


#define ADD(x, y) ((x) + (y))

在上述代码中,我们定义了一个名为ADD的宏,它接受两个参数x和y,并将其相加后返回结果。

在使用宏时,我们可以像调用函数一样使用宏。例如,要使用上述ADD宏计算1和2的和,可以使用如下代码:


int sum = ADD(1, 2);printf("1 + 2 = %d\n", sum);

在上述代码中,我们使用ADD宏计算1和2的和,并将结果打印输出。

四、注意事项

在使用头文件和预处理器指令时,需要注意以下几点:

  1. 头文件不应该包含过多的代码,以免导致编译时间过长;

  2. 需要避免头文件之间的循环包含;

  3. 宏的代码不应该过于复杂,否则容易导致代码难以阅读和维护;

  4. 宏的参数应该使用圆括号包围,以避免由运算符优先级引起的问题;

  5. 宏的使用应该谨慎,不要滥用,以免影响代码的可读性。

综上所述,头文件和预处理器指令是C语言中重要的编程工具,它们可以帮助我们在程序中引用其他代码文件、定义常量和宏、进行条件编译等操作。同时,宏是一种基于预处理器指令的编程工具,它可以将一段代码定义为一个宏,并在程序中多次调用,以达到简化代码、提高效率等目的。在实际编程中,我们应该合理使用头文件和预处理器指令,以及宏,以提高代码的可维护性、可读性和可扩展性。

C语言中的宏和预处理器

C预处理程序不是编译器的一部分,而是编译过程中的单独步骤。简单来说,C预处理器只是一个文本替换工具,它指示编译器在实际编译之前进行所需的预处理。我们将C预处理器称为CPP。

所有预处理器命令均以井号(#)开头。它必须是第一个非空白字符,并且为了可读性,预处理器指令应在第一列中开始。以下部分列出了所有重要的预处理器指令-

序号 指令与说明
1 #define
替代预处理器宏。
2 #include
从另一个文件插入特定的标头。
3 #undef取消
定义预处理程序宏。
4 #ifdef
如果定义了此宏,则返回true。
5 #ifndef
如果未定义此宏,则返回true。
6 #if
测试编译时间条件是否为true。
7 #else
#if的替代方法。
8 #elif
#else和#if在一条语句中。
9 #endif
结束预处理程序的条件。
10 #error
在stderr上显示错误消息。
11 #pragma
使用标准化方法向编译器发出特殊命令。
预处理器的一些例子-

分析以下示例以了解各种指令。

#define MAX_ARRAY_LENGTH 20
该指令告诉CPP用20替换MAX_ARRAY_LENGTH的实例。对常量使用#define以提高可读性。

#include <stdio.h>
#include “myheader.h”
这些指令告诉CPP从系统库获取stdio.h并将文本添加到当前源文件中。下一行告诉CPP从本地目录获取myheader.h并将内容添加到当前源文件中。

#undef FILE_SIZE
#define FILE_SIZE 42
它告诉CPP取消定义现有的FILE_SIZE并将其定义为42。

#ifndef MESSAGE
#define MESSAGE “你希望!”
#endif
它告诉CPP仅在尚未定义MESSAGE时定义MESSAGE。

#ifdef DEBUG
/* Your debugging statements here */
#endif
如果定义了DEBUG,它将告诉CPP处理包含的语句。如果在编译时将-DDEBUG标志传递给gcc编译器,这将很有用。这将定义DEBUG,因此您可以在编译过程中即时打开和关闭调试。

预定义的宏-
ANSI C定义了许多宏。尽管每个宏都可用于编程,但是不应直接修改预定义的宏。

序号 宏和说明
1 DATE
当前日期,以“ MMM DD YYYY”格式的字符文字表示。
2 TIME
当前时间,以“ HH:MM:SS”格式的字符文字表示。
3 FILE
包含当前文件名作为字符串文字。
4 LINE
包含当前行号作为十进制常数。
5 STDC
编译器符合ANSI标准时定义为1。
示例

#include <stdio.h>
int main() {printf("File :%s\n", __FILE__ );printf("Date :%s\n", __DATE__ );printf("Time :%s\n", __TIME__ );printf("Line :%d\n", __LINE__ );printf("ANSI :%d\n", __STDC__ );
}

输出结果

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

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

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

相关文章

c++_运算符重载(时钟加减)

介绍 本文主要介绍 减号( - )、加号( )、加等()运算符重载并复现了时钟运行方式 源码 #include<iostream>using namespace std;class Time { public://加号计算函数void t_add(int& temp, const int& Right, bool& b){//判断时间是否大于 60if ((temp Rig…

c语言-浮点型数据在内存中的存储

目录 前言一、浮点数存储例子二、浮点数在内存的存储格式2.1 32位浮点数存储格式2.2 64位浮点数存储格式 三、IEEE 754对有效数字M和指数E的规定3.1 对存储有效数字M的规定3.2 对存储指数E的规定3.2.1 E在32位浮点数的存储格式3.2.2 E在64位浮点数的存储格式 3.3 对读取有效数M…

pythonnumpy六:高级功能:数组排序、数组连接、数组拆分等。

numpy是一个强大的Python库&#xff0c;提供了丰富的数组操作功能。下面我会详细介绍numpy中的数组排序、数组连接和数组拆分等功能。 1.数组排序&#xff1a; 使用np.sort()函数可以对数组进行升序排序。它返回一个新的已排序的数组。若要在原始数组上进行排序&#xff0c;可…

谷歌Gemini模型,碾压GPT-4!

谷歌Gemini 1.0革新&#xff0c;推出Gemini Ultra、Gemini Pro和Gemini Nano模型。Gemini Ultra强大但慢&#xff0c;Gemini Pro通用&#xff0c;Gemini Nano高效。Gemini模型在多领域与ChatGPT竞争&#xff0c;尤其Gemini Pro已应用于Bard。Gemini模型预计将在2024年通过Bard …

NLP论文阅读记录 - 2021 | SimCLS:抽象概括对比学习的简单框架

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1优势 三.本文方法——抽象概括的对比学习框架3.1 第一阶段&#xff1a;候选生成3.2 第二阶段&#xff1a;无参考评估3.3对比训练 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4…

【论文阅读】AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion

AADiff:基于文本到图像扩散的音频对齐视频合成。 code&#xff1a;没开源 paper&#xff1a;[2305.04001] AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion (arxiv.org) 一种新的T2V框架&#xff0c;额外使用音频信号来控制时间动态&#xff0c;使现成的…

MySQL中的六种日志你都懂么?不懂!那就必须看看

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

docker 安装可视化工具 Portainer 以及 汉化

安装portainer是最新版本&#xff0c;汉化指定版本2.9.1 。如果要安装汉化版&#xff0c;可直接跳转步骤四 一、拉去镜像 安装网址&#xff1a;Install Portainer BE with Docker on Linux - Portainer Documentation docker pull portainer/portainer二、根据portainer镜像创建…

常用rtmp、m3u8、flv、mp4直播流在线测试地址

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

CMake入门教程【基础篇】CMake+Linux gcc构建C++项目

文章目录 1.概述2.GCC与CMake介绍3.安装CMake和GCC4.代码示例 1.概述 在Linux环境下&#xff0c;使用CMake结合GCC&#xff08;GNU Compiler Collection&#xff09;进行项目构建是一种常见且高效的方法。CMake作为一个跨平台的构建系统&#xff0c;可以生成适用于不同编译器的…

面试经典150题(55-58)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第二十四天&#xff09;完成了4道(55-58)150&#xff1a; 55.&#xff08;19. 删除链表的倒数第 N 个结点&#xff09;题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff…

渗透第四天

常用的对称加密算法有&#xff1a;DES、3DES、RC2、RC4、AES 常用的非对称加密算法有&#xff1a;RSA、DSA、ECC 使用单向散列函数的加密算法&#xff08;摘要算法&#xff09;&#xff1a;MD5、SHA 密码存储加密 md5 32位或者16位 0-9 a-f 所组成的字符串 不可…

JWT+Redis 实现接口 Token 校验

1、业务逻辑 有一些接口&#xff0c;需要用户登录以后才能访问&#xff0c;用户没有登录则无法访问。 因此&#xff0c;对于一些限制用户访问的接口&#xff0c;可以在请求头中增加一个校验参数&#xff0c;用于判断接口对应的用户是否登录。 而对于一些不需要登录即可访问的接…

基于SSM的网络游戏交易平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

java常见面试题:什么是异常?Java中的异常有哪些分类?

异常是一个汉语词语&#xff0c;读音为y chng&#xff0c;指非正常的&#xff1b;不同于平常的&#xff1b;非常。在Java中&#xff0c;异常&#xff08;Exception&#xff09;是程序在运行过程中出现的不正常情况&#xff0c;例如除以零、数组越界等。异常分为两大类&#xff…

湖南大学-算法设计与分析-2023期末考试【原题】

前言 21&#xff1a;00刚刚结束的考试&#xff0c;凭着回忆把题目重现出来了&#xff0c;在复习的时候根本找不到往年的试卷&#xff0c;希望这张回忆的试卷能帮助到下一届的同学。知道题目基本上就能做出来了&#xff0c;但是不知道是真的做不出来&#xff0c;我就不给答案了…

【软件工程】走进敏捷开发:灵活、协作、迭代的软件工艺之旅

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 敏捷开发&#xff08;Agile Development&#xff09; 详细介绍&#xff1a; 优缺点&#xff1a; 优点&#xf…

新概念英语第二册(17)

【New words and expressions】生词和短语&#xff08;5&#xff09; appear v. 登场&#xff0c;扮演 stage n. 舞台 bright adj. 鲜艳的 stocking n. &#xff08;女用…

【Mybatis】深入学习MyBatis:高级特性与Spring整合

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 高级特性 1 一级缓存和二级缓存 一级缓存 二级缓存 2 延迟加载 5 整合Spring 1 MyBatis-Spring模块 2 事务管理 结…

【Spark精讲】RDD缓存源码分析

面试题&#xff1a;cache后面能不能接其他算子&#xff0c;它是不是action操作&#xff1f; 能&#xff0c;不是action算子。 源码解析 RDD调用cache或persist之后&#xff0c;会指定RDD的缓存级别&#xff0c;但只是在成员变量中记录了RDD的存储级别&#xff0c;并未真正地…