【C语言回顾】预处理

news2024/11/17 3:48:41

  • 前言
  • 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 DEBUG
        printf("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.coloradmin.cn/o/1716973.html

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

相关文章

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition&#xff08;CRD&#xff09;时&#xff0c;Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的&#xff0c;也可以是集群作用域的…

接口测试工具:Postman的下载安装及使用

1 Postman 介绍 1.1 Postman 是什么 Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具 做 WEB 页面开发和测试的人员常用工具 创建和发送任何的 HTTP 请求(Get/Post/Put/Delete...) 1.2 Postman 相关资源 1.2.1 官方网站&#xff1a;https://www.postman.com/ …

算法(七)插入排序

文章目录 插入排序简介代码实现 插入排序简介 插入排序&#xff08;insertion sort)是从第一个元素开始&#xff0c;该元素就认为已经被排序过了。然后取出下一个元素&#xff0c;从该元素的前一个索引下标开始往前扫描&#xff0c;比该值大的元素往后移动。直到遇到比它小的元…

【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色

效果图 新建activityScrollTop.js作为mixins export default {data() {return {navBgColor: "rgba(0,0,0,0)", // 初始背景颜色为完全透明navTextColor: "rgba(0,0,0,1)", // 初始文字颜色};},onPageScroll(e) {// 设置背景const newAlpha Math.min((e.s…

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester&#xff08;补全建议&#xff09; Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能&#xff0c;引导用户在输入时找到相关结果&#xff0c;提高搜索精度。 理想情况下&#xff0c;自动补…

手机站怎么推广

随着手机的普及和移动互联网的快速发展&#xff0c;越来越多的人开始使用手机进行在线购物、社交娱乐、阅读资讯等&#xff0c;同时也催生了越来越多的手机站的出现。但是&#xff0c;在海量的手机站中&#xff0c;要让自己的手机站脱颖而出&#xff0c;吸引更多用户访问和使用…

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸&#xff08;NMN&#xff09;功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸&#xff08;β-Nicotinamide mononucleotide&#xff0c;NMN&#xff09;是一种生物活性分子&#xff0c;是一种辅酶Ⅰ&#xff08;NAD&#xff09;的前体&#xff0c;也是…

Python魔法之旅-魔法方法(04)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Idea的相关操作

1、关闭自动更新 点击左上角File->Setting&#xff0c;进入配置页面&#xff0c;点击Appearance & Behavior > System Settings > Updates&#xff0c;取消勾选更新选项&#xff0c;如图&#xff1b; 2、代码提示忽略大小写 点击左上角File->Setting&#xf…

Llama 3-V: 比GPT4-V小100倍的SOTA

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

【目标检测】基于深度学习的植物中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码 MX_001期】

系统简介&#xff1a; 这是一款基于深度学习技术的植物草药智能识别系统。系统通过分析植物草药的图像&#xff0c;能够准确地识别出不同种类的草药&#xff0c;并提供相关的信息和用途。用户只需将植物草药的图像上传至系统&#xff0c;即可快速获得识别结果。 系统利用先进…

海关接口源码:跨境贸易的数字桥梁

在全球化贸易日益频繁的今天&#xff0c;海关接口源码成为了促进国际贸易的关键技术之一。它不仅提高了通关效率&#xff0c;还确保了贸易数据的准确性和安全性。本文将探讨海关接口源码的重要性、功能以及其在现代贸易中的作用。 一、海关接口源码的重要性 海关接口源码是一…

C语言分支和循环(2)

我的相关博客&#xff1a; C语言的分支与循环&#xff08;1&#xff09; 1.switch语句 除了 if 语句外&#xff0c;C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 的 if...else 结构&#xff0c;⽤于判断条件有多个结果的情况。它把多重 else if…

大模型高级 RAG 检索策略:自动合并检索

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

C++结构体数组struct和使用sizeof 从结构体数组中取出数据并写入数字功放寄存器编程实例

C结构体数组编程实例 C结构体数组与普通数组的不同之处&#xff1a;用至少1个花括号来分隔数组。 C结构体数组定义 C结构体数组的定义和定义结构体变量的方法类似&#xff0c;struct声明其为数组即可 结构体数组实例1&#xff1a; typedef struct {u8 cmd; //定义数组中的…

【MyBatis】MyBatis操作数据库(一)

目录 MyBatis的基础定义MyBatis配置相关文件一、注解操作数据库1.1 Insert(插入注解)1.2 Delete(删除注解)1.3 Update(修改注解)1.4 Select(重点&#xff1a;查询注解)注解解决查询不匹配问题拓展&#xff1a;Param(重命名注解)和OPtions(自增注解) 二、 XML操作数据库2.1 xml实…

迷你主机Esxi 6.7挂载新硬盘

背景 硬件&#xff1a;零刻SER Pro 6 系统&#xff1a;vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了&#xff0c;但空间不够用&#xff0c;想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…

Unity2D横版摄像机跟随

在Unity2D横版游戏中&#xff0c;摄像机跟随是一个非常重要的功能。一个流畅的摄像机跟随系统可以让玩家更好地沉浸在游戏世界中。本文将介绍如何在Unity中实现2D横版摄像机跟随&#xff0c;并分享一些优化技巧。 一、准备工作 在开始实现摄像机跟随之前&#xff0c;请确保您…

分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法

不废话&#xff0c;直接上正文。_ 方法一 思路&#xff1a;利用 BodyReader 直接读取 HttpContext 的 Request Body&#xff0c;再反序列化 var reqStream context.Request.BodyReader.AsStream(); var jsonObj JsonSerializer.Deserialize<CheckAndParsingMiddlewareM…

宏集JMobile Studio—实现HMI界面高自由度设计

一、简介 物联网HMI的组态软件是数据可视化的重要工具&#xff0c;工程师可以通过图形化界面来配置、监控和管理现场采集的数据。目前&#xff0c;市面上大多数的组态软件里的可视化控件库都由设计师预先部署&#xff0c;用户只能调用而不能完全自定义控件&#xff0c;导致可视…