STLG_01_15_程序设计C语言 - 预处理器

news2025/1/7 23:35:04

        C语言预处理器(C Preprocessor)是C语言编译过程中的一个重要组成部分。它在编译器处理源代码之前,对源代码进行一系列的文本替换和处理操作。预处理器的主要任务包括宏定义、文件包含、条件编译等。

1. 宏定义 (#define)

  • 用途: 宏定义用于创建符号常量或宏函数。

  • 格式:

    #define 宏名 替换文本
    
  • 示例:

    #define PI 3.14159
    

    在代码中使用 PI 时,预处理器会将其替换为 3.14159

  • 带参数的宏: 可以定义带参数的宏,类似于函数调用。

    #define SQUARE(x) ((x) * (x))
    

    使用 SQUARE(5) 时,会被替换为 ((5) * (5))

2. 文件包含 (#include)

  • 用途: 将其他文件的内容插入到当前文件中。
  • 格式:
    #include <文件名>  // 用于系统头文件
    #include "文件名"  // 用于用户自定义头文件
    
  • 示例:
    #include <stdio.h>
    
    这个指令会将标准库头文件 stdio.h 的内容插入到当前文件中。

3. 条件编译 (#if#else#elif#endif)

  • 用途: 根据条件选择性地编译代码片段。
  • 格式:
    #if 条件表达式
        代码块1
    #elif 条件表达式
        代码块2
    #else
        代码块3
    #endif
    
  • 示例:
    #if defined(DEBUG)
        printf("Debug mode is enabled\n");
    #else
        printf("Debug mode is disabled\n");
    #endif
    
    这个指令会根据 DEBUG 宏是否定义来选择性地编译代码。

4. 宏定义检测 (#ifdef#ifndef#undef)

  • #ifdef: 检查某个宏是否已经定义。
    #ifdef MACRO
        代码块
    #endif
    
  • #ifndef: 检查某个宏是否未定义。
    #ifndef MACRO
        代码块
    #endif
    
  • #undef: 取消宏定义。
    #undef MACRO
    
    取消之前定义的宏 MACRO

5. 行控制 (#line)

  • 用途: 用于控制编译器看到的行号和文件名。
  • 格式:
    #line 行号 "文件名"
    
  • 示例:
    #line 10 "newfile.c"
    
    这条指令会告诉编译器,接下来的代码行号从10开始,并且源文件名为 newfile.c

6. 错误和警告 (#error#warning)

  • #error: 用于在预处理阶段生成编译错误。
    #if !defined(REQUIRED_FEATURE)
    #error "REQUIRED_FEATURE is not defined"
    #endif
    
  • #warning: 用于生成编译警告(部分编译器支持)。
    #warning "This is a warning message"
    

7. 预定义宏

  • __FILE__: 当前文件名。
  • __LINE__: 当前行号。
  • __DATE__: 当前日期。
  • __TIME__: 当前时间。
  • __STDC__: 表示编译器是否遵循ANSI C标准。
  • 示例:
    printf("File: %s, Line: %d, Date: %s, Time: %s\n", __FILE__, __LINE__, __DATE__, __TIME__);
    

8. 预处理器的运算符

  • defined 运算符: 用于检查宏是否定义。
    #if defined(MACRO)
    
  • 字符串化运算符 (#): 将宏参数转换为字符串。
    #define STRINGIFY(x) #x
    printf("%s\n", STRINGIFY(hello));  // 输出 "hello"
    
  • 连接运算符 (##): 将两个符号连接成一个符号。
    #define CONCAT(a, b) a ## b
    int xy = 10;
    printf("%d\n", CONCAT(x, y));  // 输出 10
    

9. 预处理器的多行宏

  • 使用 \ 来定义跨行的宏。
    #define LONG_MACRO \
        语句1; \
        语句2;
    

总结

C语言预处理器是C语言编译过程中的一个强大工具,用于在编译前对源代码进行文本替换和处理。通过宏定义、文件包含、条件编译等功能,预处理器可以帮助开发者编写更具灵活性和可维护性的代码。了解和熟练使用预处理器的各种功能,对于编写高效且可读性强的C代码至关重要。

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

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

相关文章

PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目&#xff0c;旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本&#xff0c;还能保留公式、图表、目…

RockyLinux9配置静态ip地址教程

以往我们配置linux系统的ip地址是在 /etc/sysconfig/network-scripts/ifcfg-网卡名 配置文件中编辑的&#xff0c;详情请见 Rocky8.10配置网络和主机名教程_rocky8配置网络-CSDN博客 但是在RockyLinux9系统中弃用了以前的这种方式&#xff0c;改为了新的配置方式。下面我们介绍…

民宿酒店预订系统小程序+uniapp全开源+搭建教程

一.介绍 一.系统介绍 基于ThinkPHPuniappuView开发的多门店民宿酒店预订管理系统&#xff0c;快速部署属于自己民宿酒店的预订小程序&#xff0c;包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码&#xff0c;支持私有化部署。 二.搭建环境 系统环境…

【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 带权有向图 2. 图的邻接矩阵 3. 图的邻接表 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序实现图的邻接矩阵和邻接表的存储。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 带权有向图…

【数据挖掘】深度高斯过程

深度高斯过程&#xff08;Deep Gaussian Process, DGP&#xff09;是一种结合高斯过程&#xff08;Gaussian Process, GP&#xff09;和深度学习的模型&#xff0c;旨在将高斯过程的非参数灵活性与深度模型的分层特征学习能力相结合。它可以看作是高斯过程的深度扩展&#xff0…

【NLP 18、新词发现和TF·IDF】

目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息&#xff0c;并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 ​编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…

GitLab创建用户,设置访问SSH Key

继上一篇 Linux Red Hat 7.9 Server安装GitLab-CSDN博客 安装好gitlab&#xff0c;启用管理员root账号后&#xff0c;开始创建用户账户 1、创建用户账户 进入管理后台页面 点击 New User 输入用户名、邮箱等必填信息和登录密码 密码最小的8位&#xff0c;不然会不通过 拉到…

计算机网络--路由表的更新

一、方法 【计算机网络习题-RIP路由表更新-哔哩哔哩】 二、举个例子 例1 例2

C语言 数组编程练习

1.将数组A的内容和数组B中的内容进行交换。&#xff08;数组一样大&#xff09; 2.创建一个整形数组&#xff0c;完成对数组的操作 实现函数Init()初始化数组全为0 实现print()打印数组的每个元素 实现reverse()函数完成数组元素的逆置 //2.创建一个整形数组&#xff0c;完…

H7-TOOL固件2.27发布,新增加40多款芯片脱机烧录,含多款车轨芯片,发布LUA API手册,CAN助手增加负载率,错误状态信息检测

H7-TOOL详细介绍&#xff08;含操作手册&#xff09;&#xff1a;H7-TOOL开发工具&#xff0c;1拖4/16脱机烧录&#xff0c;高速DAPLINK&#xff0c;RTOS Trace&#xff0c;CAN/串口助手, 示波器, RTT等&#xff0c;支持WiFi&#xff0c;以太网&#xff0c;高速USB和手持 - H7-…

基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型

1.单相升压自耦变压器的基本方程和等效电路 单相升压自耦变压器的接线原理图如图1所示。在建立自耦变压器的基本方程时,仍然把它看成是从双绕组变压器演变而来。在图1中,设节点a到节点b部分的绕组的匝数为,对应于双绕组变压器的原边绕组;节点c到节点a部分的绕组的绕组匝数为…

Linux——查看并修改文件夹可读可写等权限

一、查看当前文件夹下的所有文件夹的权限 ls -l二、命令 drwxrwxr-x&#xff1a;只有所有者有可读可写可执行权限&#xff0c;其他用户只有可读可执行权限。 sudo chmod -R 775 文件夹名字drwxrwxrwx&#xff1a;所有用户都有可读可写可执行权限。 sudo chmod -R 777 文件夹…

【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 纯虚函数 一、特点 二、使用场景 三、作用 四、注意事项 五、相关概念对比 2. 抽象类的使用 一、定义与概念 二、使用场景 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;设计一个矩形类、一个圆形…

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下&#xff0c;概率性出现读保护问题&#xff0c;量产时候可以通过离线烧录工具避免。代码中开了读保护&#xff0c;但是没有通过can/uart/lin/gpio控制等方式进行关闭&#xff0c;导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…

【pytorch-lightning】架构一览

pytorch-lightning是基于pytorch的一个套壳项目&#xff0c;适配pytorch的版本同步更新速度很快。 它将训练的几个主要流程模块化&#xff0c;减少重复工作&#xff0c;同时让支持分布式训练&#xff0c;不同平台的训练迁移变得更加简单。 官网链接

时空遥感影像智能解译软件(基础版)

一、时空遥感影像智能解译软件&#xff08;基础版&#xff09;简概 “时空遥感影像智能解译软件&#xff08;基础版&#xff09;”&#xff0c;该软件基于Python高级编程语言与PyQt5界面设计框架开发&#xff0c;依赖于sys、os系统库以及OpenCV、GDAL、Numpy、Math、Random、Ma…

Chapter4.3:Implementing a feed forward network with GELU activations

4 Implementing a GPT model from Scratch To Generate Text 4.3 Implementing a feed forward network with GELU activations 本节即将实现子模块&#xff0c;用于transformer block&#xff08;变换器块&#xff09;的一部分。为此&#xff0c;我们需要从激活函数开始。 深…

常见加密算法附JAVA代码案例

1、对称加密算法(AES、DES、3DES) 对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。 AES加密算法是密码学中的高级加密标准,采用的是对称分组密码体制,密钥长度的最少支持为128。AES加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的…

SwiftUI 撸码常见错误 2 例漫谈

概述 在 SwiftUI 日常撸码过程中&#xff0c;头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单&#xff0c;但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览&#xff08;Preview&#xff09;表现的行为不甚…

linux系统(ubuntu,uos等)连接鸿蒙next(mate60)设备

以前在linux上是用adb连接&#xff0c;现在升级 到了鸿蒙next&#xff0c;adb就不好用了。得用Hdc来了&#xff0c;在windows上安装了hisuit用的好好的&#xff0c;但是到了linux(ubuntu2204)下载安装了 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生…