【C语言回顾】预处理

  • 前言
  • 1. 简单概要
  • 2. 预处理命令讲解
  • 结语

在这里插入图片描述
在这里插入图片描述

上期回顾: 【C语言回顾】编译和链接
个人主页:C_GUIQU
归属专栏:【C语言学习】

前言

各位小伙伴大家好!上期小编给大家讲解了C语言中的编译和链接,接下来我们讲解一下预处理!

1. 简单概要

  1. 预定义符号:在C语言等编程语言中,预定义符号是指在标准库或系统头文件中已经定义的常量、宏和字符串。这些符号通常用于表示特定的含义,如数学函数、字符串操作符等。预定义符号的使用可以帮助程序员简化代码编写,提高可读性。
  2. #define 定义常量:在C语言中,使用 #define 指令可以定义常量。常量是一种数据类型,其值一旦被确定就不能改变。通过 #define 定义的常量,可以在程序中的多个地方使用,而无需重复指定其值。
  3. #define定义宏:宏(macro)是C语言中的一个重要概念,它允许程序员定义一些文本块,这些文本块可以在程序的不同部分被多次使用。宏的定义通常以 #define 开始,后面跟一个标识符(通常是大写字母),然后是宏的参数列表。当宏被调用时,它会替换掉源代码中的宏名,并执行宏体中的代码。
  4. 带有副作用的宏参数:宏参数本身并不存储任何值,它们只是起到占位的作用。然而,有些宏可能会对编译器产生额外的操作或影响,这种宏被称为具有“副作用”的宏。例如,某些宏可能会改变控制流、执行算术运算或其他非纯函数行为。
  5. 宏替换的规则:宏替换遵循一定的规则。首先,宏名必须是大写的;其次,在宏体内可以使用花括号 {} 来包裹代码块;最后,宏替换只发生在预处理阶段,即在编译器真正编译源代码之前。
  6. 宏函数的对比:宏函数和普通函数在功能上有一些相似之处,但它们之间也有明显的区别。宏函数不具有函数调用的典型特征,如返回值、参数类型检查等。此外,宏函数不会被编译器优化,因此它们的执行速度可能不如普通函数快。
  7. #和##:在C语言中,# 和 ## 是两个特殊的预处理标记,用于连接字符串。# 用于连接字符串中的第一个字符,而 ## 用于连接字符串中的所有后续字符。这两个标记主要用于格式化输出,特别是在配合使用 printf 等标准库函数时。
  8. 命名约定:C语言中的变量名、函数名和结构体名等都遵循一定的命名约定。这些约定有助于提高代码的可读性和可维护性。常见的命名约定包括:使用下划线来区分单词、避免使用保留字、使用驼峰命名法等。
  9. #undef:在C语言中,使用 #undef 指令可以取消之前定义的宏。当 #undef 被用来取消某个宏的定义时,该宏在程序中不再有效,也不会被执行。
  10. 命令行定义:C语言支持从命令行界面接收输入,并将这些输入赋值给变量。这可以通过使用 getchar() 或 fgets() 等标准库函数来实现。
  11. 条件编译:C语言提供了条件编译指令,如 #if、#else 和 #endif,允许程序员根据某些条件选择性地编译代码的一部分。条件编译可以根据不同的编译环境或配置选项来调整代码的行为,从而提高代码的可移植性和适应性。
  12. 头文件的包含:在C语言中,使用 #include 指令可以将其他头文件包含到当前源文件中。这使得程序员可以重用已有的代码片段,减少重复劳动,提高代码的可复用性。
  13. 其他预处理指令:除了上述提到的预处理指令外,C语言还支持其他一些预处理指令,如 #pragma、#error 和 #warning 等。这些指令用于提供额外的编译指示或警告信息,帮助程序员理解和解决编译问题。

2. 预处理命令讲解

C语言的预处理是编译过程的一个早期阶段,它主要负责处理源代码中的预处理指令(也称为预处理命令)。这些指令以#开头,并在程序的实际编译之前由预处理器执行。以下是C语言中常见的预处理指令及其详细解释:

  1. #define

    • 这是一个宏定义指令,用于为代码中的常量或代码片段定义别名。
    • 它可以带有一个参数(称为函数式宏),也可以不带参数(称为对象式宏)。
    • 示例:
    #define PI 3.14159
    #define SQUARE(x) ((x) * (x))
    
  2. #undef

    • 取消之前由#define定义的宏。
    • 示例:
    #undef PI
    
  3. #include

    • 用于包含其他文件的内容,通常用于包含头文件(.h文件)。
    • 有两种形式:#include <filename>(用于系统头文件)和#include "filename"(用于用户定义的头文件)。
    • 示例:
    #include <stdio.h>
    #include "myheader.h"
    
  4. #if, #elif, #else, #endif

    • 这些指令用于条件编译。它们允许根据某些条件包含或排除代码段。
    • 可以与defined()操作符一起使用,以检查某个宏是否已定义。
    • 示例:
    #if DEBUGprintf("Debugging information\n");
    #endif
    
  5. #ifdef, #ifndef

    • 这两个指令是#if defined(macro)#if !defined(macro)的简写形式。
    • 用于检查某个宏是否已定义或未定义。
    • 示例:
    #ifdef DEBUG// Debugging code here
    #endif
    
  6. #line

    • 更改__LINE____FILE__宏的输出,以反映后续的源代码行来自不同的文件或行号。
    • 通常在由其他工具(如词法分析器或语法分析器)生成的代码中看到。
    • 示例:
    #line 100 "newfile.c"
    
  7. #error

    • 这是一个预处理指令,用于在编译时生成错误消息。
    • 这在检查编译器版本、平台兼容性等方面很有用。
    • 示例:
    #if __STDC__ == 0#error "Not a standard C compiler"
    #endif
    
  8. #pragma

    • 这是一个特定于编译器的预处理指令,用于为编译器提供非标准的指令。
    • 不同的编译器可能对#pragma有不同的解释。
    • 示例(GCC特定):
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-variable"
    // Code that generates "unused variable" warning
    #pragma GCC diagnostic pop
    

预处理器执行完这些指令后,会将处理后的代码传递给编译器进行进一步的处理和编译。注意,预处理器本身不执行任何代码或进行任何计算;它只是根据预处理指令修改源代码。

结语

以上就是小编对预处理的详细讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【香橙派 AIpro】新手保姆级开箱教程:Linux镜像+vscode远程连接

香橙派 AIpro 开发板 AI 应用部署测评 写在最前面一、开发板概述官方资料试用印象适用场景 二、详细开发前准备步骤1. 环境准备2. 环境搭建3. vscode安装ssh插件4. 香橙派 AIpro 添加连接配置5. 连接香橙派 AIpro6. SSH配置 二、详细开发步骤1. 登录 juypter lab2. 样例运行3. …

【IDEA】-使用IDEA查看类之间的依赖关系

1、父子类的继承、实现关系 1.1、使用CTRL Alt U 选择 java class 依据光标实际指向的类位置 用实心箭头表示泛化关系 是一种继承的关系&#xff0c;指向父类 可以提前设置需要显示的类的属性、方法等信息 快捷键 Ctrl Alt S &#xff0c;然后搜索 Diagrams 1.2、使用…

python知识继续学习

1、计算机表示小数是有误差的&#xff0c;下面的5就是误差 2、在python中&#xff0c;所有的非0数字都是True&#xff0c;零是False。所有的非空字符串都是True&#xff0c;空字符串是False。空列表是False。在python的基本数据类型中&#xff0c;表示空的东西都是False&#x…

数据结构(三)循环链表 约瑟夫环

文章目录 一、循环链表&#xff08;一&#xff09;概念&#xff08;二&#xff09;示意图&#xff08;三&#xff09;操作1. 创建循环链表&#xff08;1&#xff09;函数声明&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 2. 插入&#xff08;头插&#x…

【linux】运维-基础知识-认知hahoop周边

1. HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;–Hadoop分布式文件存储系统 源自于Google的GFS论文&#xff0c;HDFS是GFS的克隆版 HDFS是Hadoop中数据存储和管理的基础 他是一个高容错的系统&#xff0c;能够自动解决硬件故障&#xff0c;eg&#xff1a…

【Linux 网络编程】网络的背景、协议的分层知识!

文章目录 1. 计算机网络背景2. 认识 "协议"3. 协议分层 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; &#x1f34e;局域网&#xff08;LAN----Local Area Network&#xff09;: 计算机数量更多了, 通过交换机和路由器连接。 &#x1f34e; 广…

多模态模型入门:BLIP与OWL-ViT

BLIP 数据预处理 CapFilt&#xff1a;标题和过滤 由于多模态模型需要大量数据集&#xff0c;因此通常必须使用图像和替代文本 (alt-text) 对从互联网上抓取这些数据集。然而&#xff0c;替代文本通常不能准确描述图像的视觉内容&#xff0c;使其成为噪声信号&#xff0c;对于…

MAC M1 —— Install

文章目录 MAC M1 —— Install安装IDEA安装JDK安装Maven安装brew无法创建文件 /data/serverMac 修改终端用户名&#xff08;主机名&#xff09;PyCharm MAC M1 —— Install 安装IDEA 关键词&#xff1a;2020到2021.3的激活步骤。找下Download文件夹 安装JDK 在个人的电脑上…

《探索Stable Diffusion:AI绘画的创意之路与实战秘籍》

《Stable Diffusion AI 绘画从提示词到模型出图》介绍了 Stable Diffusion AI 绘画工具及其使用技巧。书中内容分为两部分&#xff1a;“基础操作篇”&#xff0c;讲解了 SD 文生图、图生图、提示词、模型、ControlNet 插件等核心技术的应用&#xff0c;帮助读者快速从新手成长…

java中,怎样用最简单方法实现写word文档

在跨平台环境中实现写word时&#xff0c;如果用现成的库&#xff0c;就会涉及跨平台兼容性问题&#xff0c;比如在安卓与java中实现写word的功能。还有一个问题就是&#xff0c;完全用程序生成word文档&#xff0c;工作量较大。所以采用了模板替换的方法。 docx文档本质就是一…

算法与数据结构:二叉排序树与AVL树

ACM大牛带你玩转算法与数据结构-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a; 哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep66799?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说系列课程-年度会…

# AI作画原理:生成对抗网络(GAN)的原理与应用

AI作画原理&#xff1a;生成对抗网络&#xff08;GAN&#xff09;的原理与应用 现在&#xff0c;AI已经可以画出非常逼真的图像了。那么&#xff0c;AI是怎么做到这一点的呢&#xff1f; 深度学习与生成对抗网络&#xff08;GAN&#xff09; AI画画的核心技术之一是深度学习&…

关于MySQL数据库和数据表的基础

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…

史上最全排序算法整理!(1)

1.排序的概念及其应用 1.1排序的概念 排序是计算机内经常进行的一种操作&#xff0c;其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序&#xff0c;若整个排序过程不需要访问外存便能完成&#xff0c;则称此类排序问题为内部排序。反之&#…

实战解析:爬取音乐每日推荐歌单并自动分享

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、准备阶段 三、实战步骤 四、总结与展望 一、引言 在数字化时代&#xff0c…

Gartner发布评估威胁情报计划有效性指南:评估威胁情报有效性的四个步骤

许多组织都在努力实施 TI 并评估其价值。安全和风险管理领导者必须使用优先情报要求来评估其 TI 计划的有效性&#xff0c;并根据其组织战略完善该计划。 主要发现 尽管许多组织已将威胁情报 (TI) 纳入其安全计划&#xff0c;但他们很难评估其性能、成熟度以及在相关产品和服务…

糖尿病视网膜病变分级新方法:卷积网络做分割和诊断 + 大模型生成详细的测试和治疗建议

糖尿病视网膜病变分级新方法&#xff1a;卷积网络做分割和诊断 大模型生成详细的测试和治疗建议 提出背景相关工作3.1 数据集3.1.1 病变分割 3.1.2 图像分级3.1.3 大型语言模型&#xff08;LLMs&#xff09; 解法 数据预处理 数据增强 网络架构 训练过程 测试过程子解法1…

【408真题】2009-25

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

【数据结构与算法 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3]…

STM32FLASH闪存

文章目录 前言首先来回顾一下存储器映像FLASH简介闪存模块组织Flash基本结构&#xff08;关系&#xff09;图Flash解锁使用指针访问存储器FLASH操作Flash全擦除Flash页擦除Flash写入 选项字节选项字节操作选项字节擦除选项字节写入 器件电子签名注意闪存控制寄存器一览 前言 本…