【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 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
    

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

结语

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

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

npm镜像源管理、nvm安装多版本node异常处理

查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…

物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机

定时器概念&#xff08;常用于输出PWM波形&#xff0c;驱动电机&#xff09; 时间脉冲数时钟周期&#xff1b; 这里的脉冲数6553665536&#xff0c;支持定时器级联&#xff0c;从而延长定时 定时器类型 基本定时器原理图&#xff08;UI:更新中断&#xff0c; U:更新事件&#…

Jmeter的线程组之间传递参数

使用jemter做接口测试&#xff0c;有时候需要会遇到不同线程组之间调用相同变量的情况&#xff0c;最多见的就是token的传递&#xff0c;网上有很多处理方法&#xff0c;这里只记录setProperty的办法&#xff0c;一招鲜走遍天&#xff01; 首先我有两个线程组&#xff1a; 线程…

一种最大重叠离散小波包特征提取和支持向量机的ECG心电信号分类方法(MATLAB 2018)

目前小波分析算法常采用Mallat快速算法。该算法由与滤波器卷积、隔点采样和隔点插零等三个环节组成。由于实际使用的滤波器并不具有理想频域特性&#xff0c;使得在标准二进小波算法中存在着频率混叠和小波系数失真等缺点&#xff0c;在标准二进小波包算法中还存在频带错乱现象…

基于 Spring Boot 博客系统开发(十二)

基于 Spring Boot 博客系统开发&#xff08;十二&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;十一&#xff09;&…

热门新游 2024 植物大战僵尸杂交版 Mac 版本下载安装详细教程

最近植物大战僵尸杂交版可谓是非常的火&#xff0c;好多主播都在播这款游戏&#xff0c;我一个 Mac 党也想玩&#xff0c;可奈何该游戏目前只有 PC 版本&#xff0c;经过一番折腾终于在我的 Mac 上安装上了该游戏&#xff0c;分享给大家 其实安装过程也很简单&#xff0c;只需…

深度学习 --- stanford cs231 编程作业(如何在chrome中安装Google colab)

stanford cs231 编程作业(如何开始你的colab编程&#xff09; 斯坦福231n的所有作业都要求在colab里面做&#xff0c;colab可以为你提供免费的云计算。实际上在他的官网中也有关于如何安装colab的详细说明视频。 https://youtu.be/DsGd2e9JNH4https://youtu.be/DsGd2e9JNH4 我这…

GPU学习(1)

一、为什么要GPU 我们先看一个基本的神经网络计算 YF(x)AxB 这就是一次乘法一次加法 &#xff0c;也叫FMA&#xff0c;(fused multiply-add) 如果矩阵乘&#xff0c;就是上面的那个式子扩展一下&#xff0c;所以又用了这张老图 比如你要多执行好几个yAxB&#xff0c;可能比较简…

AI图书推荐:使用GitHub Copilot和ChatGPT辅助的Python编程

使用Python编写计算机程序变得更加简单了&#xff01;使用像GitHub Copilot和ChatGPT这样的AI辅助编码工具&#xff0c;将你的想法快速转化为应用程序。人工智能已经改变了我们编写计算机程序的方式。有了像Copilot和ChatGPT这样的工具&#xff0c;你可以用简单的英语描述你想要…

【docker】Docker的基本指令和HTML/PYTHON/C++的简单创建示例

目录 &#x1f30a;1. 什么是 Docker&#xff1f; &#x1f30a;2. Docker 安装 &#x1f30a;3. Docker基本指令 &#x1f30a;4. Docker 创建示例【联网情况】 &#x1f30d;4.1 示例&#xff1a;HTML &#x1f30d;4.2 示例&#xff1a;Python 脚本 &#x1f30d;4.3…

四信云-设备维保管理系统上线,实现设备全生命周期管理

在当今的制造业中&#xff0c;设备是企业生产的核心要素&#xff0c;是企业竞争力的基石。 随着企业发展规模不断扩大&#xff0c;设备数量急速增长&#xff0c;传统的手工管理方式已经无法满足企业需求&#xff0c;设备管理系统的出现则填补了市场需求空白&#xff0c;其目标…

5-21作业

流式域套接字 服务器端实现 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <semaphore.h> #include <…

【运维项目经历|015】:Nginx Web服务性能提升与优化项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的技术性问题 问题1&#xff1a;本次项目的人员配置&#xff1f; 问题2&#xff1a;本次项目的周期&am…

PX4使用yolo仿真环境搭建

文章目录 前言一、修改机架sdf文件二、安装yolo三、运行 前言 ubuntu20.04 PX4 1.13.3 已配置好PX4 ROS gazebo环境 一、修改机架sdf文件 将双目相机加到仿真的iris机架上 修改下图文件 添加如下&#xff1a; <include><uri>model://stereo_camera</uri>…

tensorrt输出结果为nan的解决方案

系统环境&#xff1a; ubuntu20.04 python3.9 cuda11.8 cudnn8.9.7.29 torch1.13.1cu117&#xff08;pip install torch1.13.1&#xff09; 1.针对cuda版本查了一下trt支持版本&#xff0c;发现V10和V8版本都支持 本着用新不用旧标准&#xff0c;果断下载了8.6&#xff0c…

iptables+SNAT+DNAT

一、Linux包过滤防火墙概述 主要工作在网络层&#xff0c;针对IP数据包&#xff0c;体现在对包内的IP地址、端口、协议等信息的处理上 以下两种称呼都可以表示Linux防火墙 netfilter 位于Linux内核中的包过滤功能体系 成为Linux防火墙的“内核态” 是内核的一部分&#xff0…

誉天Linux云计算架构师就业班要学习哪些内容?

课程设计思路&#xff1a; 根据十多年来毕业学员的就业和反馈&#xff0c;对数百名学员的就业回访;Linux运维&#xff0c;云计算&#xff0c;高并发&#xff0c;分布式&#xff0c;容器&#xff0c;云原生&#xff0c;自动化等是目前市场上就业情况最好&#xff0c;需求量最大&…

SQL查询-电商数据案例

假设我们现在需要是某电商平台数据分析&#xff0c;由于业务需要&#xff0c;需要用sql取数 包括&#xff0c;Python连接数据库到模拟电商数据库&#xff0c;到sql场景查询 1,Python连接SQL数据库 以下是使用Python连接MySQL数据库并进行操作的示例代码&#xff1a; import…

【python】python 全国5A级景区数据采集与pyecharts可视化(源码+数据+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Liunx上安装MySQL

该文章是介绍的是 Ubuntu 操作系统&#xff0c;如果有使用 CentOS 的小伙伴不会的话可以私信我~ 1. 查找安装包 apt list |grep "mysql-server" 2. 安装mysql sudo apt install mysql-server 注意&#xff1a;安装的到最后一步会问你是否继续&#xff0c;输入y / Y就…