初出茅庐的小李之C语言必备知识预处理

编译预处理

编译预处理就是在编译源代码之前进行的一系列处理,将源程序中的一些特殊命令进行展开或处理,生成扩展的源代码。这些特殊命令通常以“#”开头,占单独的行,语句尾部不需要加分号。

宏定义

(#define)是一种常见的编译预处理指令,用于定义宏,实现代码的简化和重用。

文件包含(#include)用于在源文件中引入其他文件的内容,方便代码模块化和复用。

条件编译

(#if, #else, #endif等)允许根据条件选择性地编译部分代码,提高代码的灵活性。

在预处理阶段,这些指令会被解释和处理,生成经过预处理的源代码,然后再经过编译、汇编、链接等步骤生成最终的可执行文件。这个过程有助于提高代码的可维护性和可移植性。

书写格式

以“#”开头、占单独行、语句尾不加分号。
这样的规范有助于编译器正确解释和处理这些指令,同时也使得代码更加清晰易读。这样的一致性规范有助于维护代码时的可读性和可理解性。

宏定义的例子

// 定义常量#include <stdio.h>#define MAX_SIZE 100
#define PI 3.1415926// 简化代码
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))#define DEBUG   //只要定义了该宏 DEBUG_PRINT就会起作用 没有定义则不起作用 // 字符串拼接//#define CONCAT_STR(a,b) a##b dev平台用不了 linux未测试
#define CONCAT_STR(a,b) a b// 条件编译
#ifdef DEBUG#define DEBUG_PRINT(msg) printf("Debug: %s\n", msg)
#else#define DEBUG_PRINT(msg)
#endifint main(void) 
{printf("5的平方是%d\r\n",SQUARE(5));printf("MAX(2,3)返回较大的一个数是%d\r\n",MAX(2,3)) ;DEBUG_PRINT("调试信息"); printf("%s\r\n", CONCAT_STR("你好", "World"));  // 这里会被展开为 printf("%s\r\n", "你好, " "World");
}

这里踩到了一个坑… dev里这个##符号竟然不能使用!看了这个博主的文章才明白
https://blog.csdn.net/leon1741/article/details/78149881,致谢致敬
在这里插入图片描述

运行结果

在这里插入图片描述

宏定义使用注意事项

使用宏定义时需要注意一些事项,以确保代码的可读性和正确性。以下是一些宏定义的注意事项:

  1. 括号的使用:

    在宏定义中,为了避免优先级问题,通常在宏的参数和整体表达式外部都使用括号。例如:

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

    这样可以确保在使用时不会出现预期之外的行为。

  2. 避免副作用:

    在宏中避免使用具有副作用的表达式,因为宏是简单的文本替换,可能导致意外的行为。

    // 避免这样的宏定义
    #define INCREMENT(x) x++
    
  3. 使用大写字母:

    为了与变量和函数名区分,宏的名称通常使用大写字母。

    #define MAX_SIZE 100
    
  4. 多行宏的注意:

    如果宏跨越多行,确保在每行的末尾使用反斜杠 \ 连接,以避免语法错误。

    #define PRINT_SUM(a, b) \do { \int sum = (a) + (b); \printf("Sum: %d\n", sum); \} while(0)
    
  5. 参数的使用:

    宏参数的使用要小心,确保在宏展开时不会导致预期之外的结果。

    // 不要这样使用,可能导致问题
    #define SQUARE(x) x * x
    
  6. 条件编译:

    在使用条件编译时,确保相关的宏定义和取消定义都是正确的。

    #ifdef DEBUG// ...
    #endif
    

总体来说,清晰、简洁、避免副作用是设计宏定义时的关键原则。良好的宏定义可以提高代码的可读性和可维护性。

在单片机中可以使用预编译来区分代码版本

如果定义了REG_CODE 这个宏且其结果是1那么就是寄存器版本代码否则就是库函数版本代码

void LED_Config(void)
{#if (REG_CODE)RCC->AHB1ENR |= 1<<2;      //GPIOC的时钟开关GPIOC->MODER &= ~(3<<2*4);//把89位清00 PC4GPIOC->MODER |=  (1<<2*4);//只是把第89位置01GPIOC->MODER &= ~(3<<2*5);//把10 11位清00 PC5GPIOC->MODER |=  (1<<2*5);//只是把第89位置01GPIOC->MODER &= ~(3<<2*6);//把11 12位清00 PC6GPIOC->MODER |=  (1<<2*6);//只是把第89位置01GPIOC->MODER &= ~(3<<2*7);//把89位清00  PC7GPIOC->MODER |=  (1<<2*7);//只是把第89位置01GPIOC->OTYPER &= ~(1<<4); //推挽模式//0xFFFF FFEF GPIOC->OTYPER &= ~(1<<5);GPIOC->OTYPER &= ~(1<<6);GPIOC->OTYPER &= ~(1<<7);//假设输出状态 灯的开关GPIOC->ODR |=  (1<<4)| (1<<5)|(1<<6) |(1<<7);  //默认全关printf("寄存器代码...\r\n");#elseprintf("LED库函数代码...\r\n");RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Speed  = GPIO_High_Speed;GPIO_Init(GPIOB,&GPIO_InitStruct);#endif}

至此,预编译相关的知识点就介绍完了。

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

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

相关文章

国产航顺HK32F030M: 简易篮球计分器(便携计分器)

【自制】《基于航顺HKF030MF4P6手持比赛计分牌》&#xff08;便携计分器&#xff09; 1. 简介 便携篮球计分器是一种小型化设计的设备&#xff0c;主要用于记录和显示篮球比赛的得分和计时。以下是由Type-C充电电路TP5400/ASM1117电路、HK32F030MF4单片机最小系统、数码管显示…

AlDente Pro v1.22.2(mac电池最大充电限制工具)

AlDente Pro是一款适用于Mac操作系统的小工具&#xff0c;可以帮助您限制电池充电量以延长电池寿命。通常情况下&#xff0c;电池在充满的状态下会继续接受电源充电&#xff0c;这可能会导致电池寿命缩短。使用AlDente Pro&#xff0c;您可以设置电池只充到特定的充电水平&…

【机器学习】聚类(二):原型聚类:LVQ聚类(学习向量量化)

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. LVQ类a. 构造函数b. 闵可夫斯基距离c. LVQ聚类过程e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令行界面 &#xff…

超实用:通过文字就可以操纵这款AI表格,不需要你懂Excel函数

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 工具介绍 今天给大家分享超实用的AI表格ChatExcel&#xff0c;这个工具是由北大团队在2022年3月开始开发的AI表格处理神器&#xff0c;上传你的表格后&#xff0c;只需要用文字描述你…

Javascript每天一道算法题(十八)——矩阵置零-中等

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——标记数组 1、问题 给定一个 y x x 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2、示例 示例 1&#xff1a; 输入&#xff1a;matrix [[…

使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步

背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能&#xff0c;就像大数据领域里有离线计算和实时计算&#xff0c; ETLCloud 还提供了基于 CDC &#xff08;Change Data Capture&#xff09;的实时数据集成功能&#xff1a;实时数据集成是指通过变化数据捕获技术&#…

【MySQL】数据库基础操作

&#x1f451;专栏内容&#xff1a;MySQL⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数据库操作1、创建数据库2、查看所有数据库3、选定指定数据库4、删除数据库 二、数据表操作1、创建数据表2、查看所有表3、…

1.Linux基础命令

1.打开命令窗口 crtlaltt 2.显示当前目录中的文件 ls 3.创建目录/文件夹 mkdir 文件名 4.进入文件夹 cd 目录 cd . .回到上一级目录 cd . ./. ./回到上上级目录 5.创建文本 gedit 文本名 6.删除文件 删除文件夹 rm -r 文件名&#xff08;强制删除&#xff09; 删除文本 rm…

python -opencv 图像锐化

python -opencv 图像锐化 图像锐化其实&#xff0c;是一种增强图片对比度的技术&#xff0c;我们可以通过计算图像的导数&#xff0c;把导数绝对值数值大于零的数值加回原图像&#xff0c;通过这种方法&#xff0c;可以增强图像的对比度。 实现代码如下&#xff1a; import c…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

【从浅识到熟知Linux】基本指定之find、grep、head和tail

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;一篇又一篇&#xff0c;学写越上头。 文章前言&#xff1a;本文介绍find、grep、head和tail指令用法并给出示例和截图。 文章目录 find基本…

大中小协作 共筑科学梦——华中科技大学附属花城中学举办首届科技节

为普及科学知识&#xff0c;张扬科学精神&#xff0c;创设浓郁的科学氛围&#xff0c;11月24日&#xff0c;华中科技大学附属花城中学举办了以“走近科学&#xff0c;触碰未来”为主题的首届科技节暨科创文化展示周活动。学生们在学习中感受科技的魅力&#xff0c;在“玩”中感…

实现简单的操作服务器和客户端(上)

一、说明 描述:本教程介绍如何使用 simple_action_server 库创建斐波那契动作服务器。此示例操作服务器生成斐波那契序列,目标是序列的顺序,反馈是计算的序列,结果是最终序列。 内容 创建操作消息编写一个简单的服务器 代码

【LM、LLM】浅尝二叉树在前馈神经网络上的应用

前言 随着大模型的发展&#xff0c;模型参数量暴涨&#xff0c;以Transformer的为组成成分的隐藏神经元数量增长的越来越多。因此&#xff0c;降低前馈层的推理成本逐渐进入视野。前段时间看到本文介绍的相关工作还是MNIST数据集上的实验&#xff0c;现在这个工作推进到BERT上…

[极客大挑战 2019]Secret File1

[极客大挑战 2019]Secret File1 在bp里面发现secr3t.php 将secr3t.php 直接加在网站后面&#xff0c;发现了有关flag的信息&#xff0c;一个flag.php文件 在遇到flag.php时候&#xff0c;联想到php伪协议&#xff0c;构造伪协议方式 secr3t.php?filephp://filter/readconver…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

FFmpeg零基础学习(一)——初步介绍与环境搭建

目录 前言正文一、开发环境二、搭建环境三、测试代码四、调用库的介绍End、遇到的问题2、Qt 在线安装容易报错&#xff0c;断开问题1、在线安装QMaintainTool很慢2、Qt5.15 无法调试FFmpeg 参考 前言 FFmpeg是一个开源的跨平台多媒体处理框架&#xff0c;它包含了一组用于处理…

【图解系列】一张图带你了解 DevOps 生态工具

一张图带你了解 DevOps 生态工具 ✅ 协作&#xff08;Collaborate&#xff09;&#xff1a;JIRA、Confluence 大家肯定不陌生了&#xff0c;我之前也写过利用 Jekyll 搭建个人博客的帖子。✅ 构建&#xff08;Build&#xff09;&#xff1a;常用的 SCM&#xff08;Software Con…

掌握未来技术趋势,成为领先者——深度解析2023年技术热点

掌握未来技术趋势&#xff0c;成为领先者——深度解析2023年技术热点 摘要&#xff1a;本文探讨当前最热门的技术趋势。我们将介绍人工智能、大数据、区块链、5G等前沿技术&#xff0c;并阐述它们如何改变我们的生活。最后&#xff0c;我们将总结如何利用这些技术趋势&#xf…

2024年天津天狮学院专升本计算机科学与技术《数据结构》考试大纲

2024年天津天狮学院计算机科学与技术专业高职升本入学考试《数据结构》考试大纲 一、考试性质 《数据结构》专业课程考试是天津天狮学院计算机科学与技术专业高职升本入学考 试的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试…