朝花夕拾 · C语言 | 预处理命令篇

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

一.gcc编译的四个步骤

gcc main.c -> a.out
预处理:

展开和#相关的代码:展开头文件、展开宏、处理预处理命令

#include <stdio.h>
#define PI 3.1415
#if0
#endif

gcc -E main.c -o main.i

编译:

将c语言程序转换成汇编指令。
gcc -S main.i -o main.s

汇编:

将汇编指令转换成二进制可执行程序
gcc -c main.s -o main.o

链接:

负责链接系统的函数/库函数的实现(链接函数)
gcc main.o -o main

二.预处理命令

  • 宏定义
  • 不带参宏:--->符号常量

#define  标识符  值

#define  PI  3.1415

注意:

1.宏作为预处理命令,负责在预处理阶段展开,不做运算,只是代码的替换

2.宏标识符最好大写

3.宏只是代码的替换,尽量加()

4.宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换

5.#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。
6.可以用#undef 命令终止宏定义的作用域。

7.宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作
字符替换,不分配内存空间

  • 带参宏

#define  宏名(参数表)  字符串

1.对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参

2.在宏定义时,在宏名与带参数的括号之间不应加空格;否则将空格以后的字符都作为代替字符串的一部分

  • 带参宏与函数的区别:

(1)函数调用时,先求出实参表达式的值,然后代人形参。而使用带参数的宏只是进行简单的字符替换。例如上面的S(a+b),在宏展开时并不求a+b的值,而只将实参字符"a+b"代替形参r。
(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值"的概念。

(3)对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。

(4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。

(5)使用宏次数多时,宏展开后源程序变长,因为每展开一次都使程序增长,而函数调用不会使源程序变长。
(6)宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。一般用宏来代表简短的表达式比较合适。有些问题,用宏和函数都可以。

(7)宏是预处理阶段的代码替换,会使代码体积增大.函数是在运行时的调用,需要保护和恢复现场

  • 头文件包含
#include<stdio.h>
#include "head.h"

头文件放:
1.可以有包含的其他头文件
2.声明的数据类型
3.宏定义
4.函数和全局变量的声明

注意:
1.<>表示包含的是系统中的头文件,让编译器从系统路径下找:/usr/include
2." "表示包含的头文件是用户自己定义的头文件,让编译器从当前路径下寻找。

esc进入命令行,:+vsp竖向打开多文件;:+sp横向打开多文件

#ifndef __HEAD_H__        //防止宏定义被多次展开
#define __HEAD_H__

#include<stdio.h>

#define ADD(A,B) ((A)+(B))

#endif

    • 条件编译

    1.头文件中防止头文件重复包含

    #ifndef 宏
    #define 宏
    //头文件内容
    # endif 

    根据“宏”有没有被定义出来决定该头文件中的内容要不要加入到编译中。


    2.条件编译

    #if        逻辑结果表达式
    // 代码
    # endif 

    根据“逻辑结果表达式”的结果,决定中间的代码要不要加入到编译中


    //代码屏蔽
     

    # if 0 
    //代码
    # endif 

    3.

    #ifdef 宏
    //代码1
    # else 
    //代码2
    # endif 

    根据“宏”有没有被定义决定是否编译代码1或者代码2

    #ifndef 宏
    //代码1
    # else 
    //代码2
    # endif 
    数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码) 数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994 立即下载

    相关推荐

    产业园区如何高效对接企业技术需求与高校科研成果?.docx

    科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

    朝花夕拾 · C语言 | 函数篇

    此外 ,%f 不能接收double型,且双引号里写了什么,在输入时也要相同,所以除了格式控制符之外尽可能少写其他数据。八进制与十六进制也可指定输出域宽,如%8o表示输出八位八进制数,%8x表示输出八位十六进制数;此外,%lo与%lx则可表示以八和十六进制输出long型。在输入整型时,可以使用空格,Tab与Enter隔开两数,除此之外用其他字符则会直接中断输入,舍弃后续读入的数字。域宽输出: 7. %nd 以n位域宽输出,若数据大于n位则以实际位数输出,否则左侧补空。

    Vvc_Python的博客 349

    国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

    科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

    朝花夕拾 · C语言 | 多文件篇

    4.在对应的头文件中加extern关键字声明,头文件中全局变量只能声明不能初始化,定义应在.c文件。Makefile:管理代码工程的编译和链接,由make工具进行解释,实现一键化工程的编译和链接。依赖文件(生成目标文件所依赖的源文件):main.c sum.c sub.c ......编译规则:gcc main.c sub.c sum.c ( -o a.out)在头文件的声明里,函数默认为extern,编译器会自动加上。2.如果只是在定义该全局变量的文件中使用该全局变量,可以不声明;

    Vvc_Python的博客 394

    国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

    科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

    FileZilla Server 1.2.0 TLS证书过期问题

    FileZilla Server TLS证书过期后重新生成

    Wigle的备忘录 7527

    【朝花夕拾】C语言-空白与注释

    从严格意义上来说,C语言并没有如Python那样严格的缩进限制,所以你可以很自由的编写你的代码。但是,那样会导致你的代码可读性非常差,当你的程序出现了BUG,想要调试的时候,你会发现自己都不知道自己写的是什么了。因此一个良好的编码习惯显得尤为重要,不为了别人,就为了我们自己能够很好的DEBUG,我们也应该养成一个良好的编码习惯。 一、合理的使用注释 注释分为行注释和块注释,所有的注释都会被预处

    心若微尘的博客 1183

    ENVI 5.3与IDL 8.5安装指南:从下载到激活的完整流程

    本文提供了一份详细的ENVI 5.3与IDL 8.5安装教程,涵盖从获取安装包、运行主程序、安装许可证到关键文件替换的完整流程。指南重点解决了激活过程中的常见问题,并分享了个人实践经验,旨在帮助用户,特别是遥感图像处理初学者,一次性顺利完成软件部署,为后续的科研与开发工作奠定基础。

    weixin_29213827的博客 546

    C语言一文速成 | 期末保命夺分神器!

    用户编程时使用的名字函数声明:在使用函数前,需要声明他的返回类型和参数列表//返回值 函数名(参数列表);函数定义:完整的函数实现,包括函数体。return a+b;数组是一种数据结构,用于存储一组相同类型的数据数组中的元素在内存中是连续存放的数组通过下标来访问元素,下标从0开始。

    爱因斯晨的博客 1239

    sysbench安装(在线&离线)

    sysbench下载、安装、编译和异常处理方法

    m0_61066945的博客 8754

    使用 Python 获取实时港股行情数据

    在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

    kk_stoper的博客 1517

    C++朝花夕拾-`assert`

    C++中的assert是调试断言工具,用于开发阶段捕捉程序设计错误(如参数检查、不变式验证),通过条件判断立即终止程序并输出错误信息。它与异常处理机制不同:assert针对"绝不该发生"的程序错误,在Release模式下会被完全移除;而异常处理用于应对运行时可能发生的意外情况(如用户输入错误、文件缺失),可捕获恢复且始终存在。assert遵循"Fail Fast"原则,适用于函数前置条件、指针有效性检查等场景,但不应用于用户输入验证或资源检查。大型项目常结合自定义断言

    DGerhartz的博客 1490

    【语音识别】基于MFCC特征实现说话人语音识别matlab源码

    1 模型 采用能够反映人对语音的感知特性的Mel频率倒谱系数(MFCC)作为特征参数,以及为避免时间规整问题采用矢量量化技术开发的说话人识别系统.MFCC主要的是模拟人耳的听觉过程,相对于其它参数它对语音波形的变化不敏感,更加稳定,系统取得很好的识别结果,实验表明系统训练和识别的计算量和存储量都比较低. 2 部分代码 functionvarargout=Main(varargin) % MAIN M-file for Main.fig % MAIN, by itself...

    qq_59747472的博客 848

    朝花夕拾(名字太短)

    不定时更新,一些杂题。

    2501_91006298的博客 1202

    基于深度学习的商品标签识别系统:UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集

    基于YOLO系列模型的商品标签识别系统能够有效解决商品信息提取的自动化问题。通过合理的数据集准备、模型训练和UI设计,我们可以实现一个功能强大的商品标签识别系统。希望本文提供的内容能够为大家提供有价值的帮助。

    YOLO 474

    基于Simulink的PID控制防抱死制动系统(ABS)建模与仿真

    防抱死制动系统(Anti-lock Braking System,简称ABS)是一种用于防止车辆在紧急制动时车轮完全抱死的技术。通过实时监测车轮速度并调节制动力,ABS能够显著提高车辆的制动性能和操控稳定性,从而减少交通事故的发生。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于ABS控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的ABS系统,重点研究PID参数调优方法、系统动态响应特性以及制动过程中的滑移率控制能力。

    MHD0815的博客 484

    【NLP自然语言处理】1.基础-入门&文本预处理

    NLP自然语言处理,入门&文本预处理, jieba分词器

    资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 403

    YOLO11检测中的内存占用分析与优化:讲解如何分析并优化推理时的内存使用

    YOLOv11模型内存分析与优化摘要:本文系统分析了YOLOv11目标检测模型的内存使用模式,重点探讨了显存(VRAM)、系统内存(RAM)和共享内存的特性差异。通过PyTorch内置工具和自定义分析器,详细剖析了骨干网络、颈部网络和检测头各组件内存占用规律,指出激活值内存与输入尺寸呈平方级增长关系。文章提供了卷积层内存计算公式,并强调合理规划"工作台"(显存)与"仓库"(内存)间的数据流动是优化关键。最后通过流程图直观展示了YOLOv11推理过程的三类内存使用模式,

    本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 344

    【带你快速了解人工智能开发自然语言处理基础课程第二十八周】

    自然语言处理。#博学谷IT学习技术支持#自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域.提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

    weixin_44126780的博客 353

    文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

    主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

    OV9734 DATASHEET,完整规格书

    OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

    C++的前世今生C的诡谲[转载]

    从研究生二年纪开始学习计算机也差不多两年了,一路走来,有很多的收获,也有不少的遗憾,现在正好有一段闲暇,就想对走过的路留下一些足迹,回忆。每个人都有自己不同的人生,说到这里,就是程序人生了,歌德在《浮士德》中说过:“如果不曾在悲哀中咀嚼过面包,不曾在哭泣中等待过明天,这样的人就不知道你——天的力量。”所以我想记下一些带给我悲哀,带给我哭泣的程序人生。其实学习计算机的基础课程是非常重要的,离散数学,

    冷剑魂的专栏——垃圾场 1269

    蓝牙模块HM-10手册

    蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

    05阶段:NLP自然语言处理基础(1)

    one-hot编码的优劣势:劣势:完全割裂了词与词之间的联系,而且在大语料集下,每个向量的长度过大,占据大量内存.正因为one-hot编码明显的劣势,这种编码方式被应用的地方越来越少,取而代之的是接下来我们要学习的稠密向量的表示方法word2vec和word embedding.word2vec介绍 1- 是将文本变成词向量张量的一种方法,是一种无监督(自监督)的训练方法,本质是训练一个模型,将模型的参数矩阵当作所有词汇的词向量表示。基于one-hot的形式进行优化改造 2-

    专注前端开发领域,深耕 Python AI Agent应用开发,热爱探索 Web 与人工智能的前沿技术。 338

    ET2012新版免狗免安装绿色软件

    ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

    php mysql ppt,7PHP访问数据库分析.ppt

    7PHP访问数据库分析习题 4. 下列哪个函数可以将结果集的指针移动到指定的位置 A. mysql_fetch_rowB. mysql_fetch_assoc C. mysql_queryD. mysql_data_seek 5. PHP连接mysql数据库的连接函数mysql_connect的第三个参数是:() A. 主机名B. 数据库密码C. 数据库用户名 D. 报错信息 6. mysql_a...

    weixin_34602954的博客 219

    C++初窥

    之前做了几年的FPGA,期间也开发过STM32程序,仅限于根据需求点亮LED单色屏。可是随着工程的需求,以及越来越多的发现,虽然FPGA在做硬件(数据)加速尤其是算法层面数据预处理或者中间数据的处理有着非常天然的优势,也得益于FPGA特性---并行性以及一些高速接口,eg:DDR4/serDes/100G Ethernet...。但是在面对一些更加复杂算法时,实现难度也是几何级数的增加。并且现在x...

    白羊座 258

    php7读数据库内容,7PHP访问数据库解读.ppt

    7PHP访问数据库解读习题 4. 下列哪个函数可以将结果集的指针移动到指定的位置 A. mysql_fetch_rowB. mysql_fetch_assoc C. mysql_queryD. mysql_data_seek 5. PHP连接mysql数据库的连接函数mysql_connect的第三个参数是:() A. 主机名B. 数据库密码C. 数据库用户名 D. 报错信息 6. mysql_a...

    weixin_35914648的博客 182

    static 的三种用法:C 语言里一个关键字的三张面孔

    本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

    大模型全栈工程师 · Thanks_ks 316

    【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c

    AI 编程时代,开发语言选型需综合考量AI适配度、编译速度、跨平台与学习成本。Python以海量语料和即时执行成首选,适用于AI/ML与原型开发;TypeScript凭借类型系统与秒级构建,成为前端及应用层主流;Go以极速编译与统一风格,契合AI代理高效迭代需求。Rust/C++虽性能强,但编译慢、学习成本高,不适于快速试错。综合推荐:优先选Python、TypeScript、Go,兼顾效率与生态,实现最优AI协作体验。

    freewebsys的专栏 550
    上一篇: 朝花夕拾 · C语言 | 指针篇
    下一篇: 朝花夕拾 · C语言 | 结构体篇
    剑指offer.
    博客等级 码龄3年 15粉丝 38原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值