#include “ascii_font.c“ 引入源文件,Keil5为什么没有提示重复定义错误,详解!!!

目录

相关原理

Keil编译器规则

重点知识.c文件和.h文件的处理方式和用途

 为什么在 example.c文件中需要这条指令#include "example.h"     

没有包含会怎么样


配置前提

        首先没有提示重复定义.c文件进行报错的前提是,Keil5中没有添加这源文件(ascii_font.c)    但是在Drivers工程目录下面,文件是存在的    

        这里或许会有小伙伴会好奇,为什么没有提示,下面这个提示,因为他善!!!

Freertos_01\Freertos_01.axf: Error: L6200E: Symbol ascii_font multiply defined (by driver_oled.o and ascii_font.o).
Not enough information to list image symbols.

相关原理

          开个玩笑,这里需要理解编译器#include 这条指令到底干了什么事情,当你在某个源文件中使用 #include "ascii_font.c" 时,编译器实际上是将 ascii_font.c 文件的内容直接嵌入到包含它的源文件中。就像是在这个源文件的相应位置插入了 ascii_font.c 文件的内容一样。此时,编译器视为单个源文件在进行处理

        视为单个源文件进行编译处理事带着引入的.c文件的,也就是说#include "ascii_font.c" 这条指令会让 ascii_font.c 被编译一次

Keil编译器规则

        在Keil5和大多数C/C++的编译环境中,源文件.c文件,都是通过项目配置来编译的,也就是Keil的工程目录结构中,添加.c文件才编译,不添加就不编译。

        #include 引入编译一次,Keil5本身没有编译,所以就报不了,重复定义这个错误,是因为#include "ascii_font.c"在整个工程中,只被用了一次,多次使用肯定报错。

重点知识.c文件和.h文件的处理方式和用途

       .c文件的处理方式,.c文件是源码文件,通常包含了,函数的实现和全局变量的定义,在项目构建的过程中,编译器会将文件编译为目标文件(.o或者.obj)文件

        编译器编译的过程,只会编译在C项目中添加的.c文件,这个时候才会编译,如果只在文件夹中添加,但是在编译器中的工程目录结构下,没有添加这个时候是不会编译的。

所以在添加驱动函数的时候,一定要添加.c文件.h文件添不添加无所谓,引用就行了

        .h头文件处理方式,这个文件通常用于声明函数,变量和宏定义,这个文件不会被编译器,编译而是通过  #include预处理指令,引入在.c文件中包含, 在.c文件中 #include "ascii_font.c" 编译器会将 ascii_font.c 的内容直接插入到,使用#include调用的文件中。

        总结:#include 的作用就是在编译器在预处理阶段,将一个文件的内容,复制到,另一个文件中,这种方式允许在.c文件中重复使用相同的声明,而不会导致重复定义。

 为什么在 example.c文件中需要这条指令#include "example.h"     

为什么每次在写驱动文件的时候,在.c文件中必须引入头文件作用是什么。

        当我们在.c文件中引入.h文件,这个时候编译器在编译.c文件的时候,会自动检查 driver_lcd.h driver_lcd.c   函数声明和函数定义的情况是否相同,就是会帮你检测有没有在.h文件中有没有声明错误

        这样可以保证函数的声明和定义是一样的,不一样会报错,就是这条语句的作用。如果不一致编译器会报错,提示你去修改这个声明或者实现。

没有包含会怎么样

        如果你不在 example.c 中包含 example.h,那么函数的实现仍然有效,但你失去了编译时自动同步声明和实现的检查。例如,如果你修改了头文件中的声明,而忘记修改实现,可能会导致其他引用这个函数的 .c 文件编译失败,或者在运行时出现未定义行为。

        同时,#include .h文件,在其他.c文件中,是为了告诉编译器,这个函数声明的存在,但是这里只有声明没有实现部分,在连接阶段,编译器会结合两个.c文件的内容,这样有了声明也有了实现,就能正常调用函数。

                               欢迎指正,希望对你,有所帮助!!!

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

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

相关文章

Linux服务管理(五)Apache服务优化

CustomLog "|/bin/rotatelogs -l /wwwlogs/access_%Y%m%d.log 86400" combined日志旋转可参考这篇文章: https://blog.csdn.net/weixin_43576565/article/details/139989701 要优化首先你得有Apache yum -y install httpd启动 service httpd start写入…

yolov8人脸识别案例

GitHub - wangWEI201901/YOLOv8-Detection-Project: 🛣️基于YOLOv8的智慧校园人脸识别和公路汽车检测

5、关于kali搭建vulhub

Vulhub是一个基于Docker和Docker-compose的漏洞靶场环境,所以搭建vulhub分三步: 1、安装docker 2、安装docker-compose 3、安装vulhub 一、安装步骤 1、安装docker 因为kali太久没用,所以需要先更新软件列表最新源 apt-get update 安装do…

DC-DC高压输入30V/10W全桥拓扑结构隔离开关电源专用芯片

概述: PC6703 是一款专门为小体积、低待机功耗的微功率隔离电源而设计的变压器驱动器,其外围只需匹配简单的输入输出滤波电容、隔离变压器和整流电路,即可实现 6~30V 输入电压、多种输出电压、输出功率1 ~10W 的隔离电源。 PC6703 内部集成…

C++11新特性总结

相比于C98/03,C11是C程序设计语言标准的一个新的版本,在2011年由ISO批准并发布。C11新标准从而代替了原来的C98和C03。C11标准是对C的一次巨大的改进和扩充。在核心语法,STL标准模板等方面增加众多新功能,新亮点。C11能够更好地用…

Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升

导读: 开源无国界,StarRocks 自开源以来,近3年的时间里已在全球数据技术领域崭露头角。我们欣喜地发现,越来越多的海外用户正在使用并积极推广着 StarRocks。为了促进知识共享,StarRocks中文社区将精选优秀文章与大家共…

【知识专栏丨python数分实战】天猫订单数据分析及可视化|taobao天猫订单接口

今天这篇文章将给大家介绍天猫订单数据分析及可视化案例。 import pandas as pdimport numpy as npfrom pyecharts.charts import Pie,Bar,Line,Map,Map3D,Funnelfrom pyecharts import options as optsimport matplotlib.pyplot as pltimport warningsimport seaborn as snsfr…

线性表——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表(Linear List)的定义 ​ 线性…

LabVIEW电机测试系统

LabVIEW电机测试系统采用共直流母线架构,优化能量循环方式,实现内部能量循环。系统利用高精度仪器与先进软件技术,提供了一个高效、可靠的测试平台,适用于200 kW以下的交流异步电机和永磁同步电机的性能及耐久性测试。 项目背景 …

回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN

回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN 文章目录 前言回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN 一、SSA-DNN模型1. 麻雀优化算法&…

【LVS】部署NAT模式集群

一、实验环境 每台主机的防火墙和SELinux都要关掉 systemctl stop firewalld setenforce 0 client(测试机): ip 172.25.254.50 lvs(调度器): vip 172.25.254.100 dip 192.168.0.100 RS1(真实服…

【Linux】【网络】进程间关系与守护进程

进程间关系与守护进程 文章目录 1.进程组1.1什么是进程组1.2组长进程 2.会话2.1什么是会话2.2如何创建会话 3.作业3.1什么是作业、作业控制?3.2作业号3.3常见作业状态3.4作业的切换 4.守护进程4.1什么是守护进程?4.2如何创建守护进程4.3模拟实现daemon …

单片机GPIO模式和应用

Push pull 推挽输出 定义:推挽输出是一种输出模式,其中引脚可以输出高电平或低电平,且两种电平状态下都具有较强的驱动能力。 特点: 无论输出高电平还是低电平,都有较强的电流驱动能力。 适用于驱动外部数字电路…

抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)

转载请注明出处! 原文链接:https://blog.csdn.net/zgyulongfei/article/details/140960430 本文适合的读者为: 抖店(抖音小店)个体商家;抖店店群商家(店群商家:指的是开了几十个抖…

Netty技术全解析:FixedLengthFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【代码故事】VSCode知名主题material-theme仓库代码清空

大家好&#xff0c;我是前端之虎陈随易。 这是我的个人网站 https://chensuiyi.me。 出大事了 看到了一篇前端社区开源扛把子 Anthony Fu 的帖子。 经过一番了解&#xff0c;出大事了&#xff01; 知名 VSCode 主题 material-theme 仓库清空了&#xff01; 连带着所有提交…

开源AI智能名片微信小程序:以人性洞察与资源优化为驱动的社群营销新策略

摘要&#xff1a;随着科技的飞速发展&#xff0c;特别是人工智能&#xff08;AI&#xff09;技术的广泛应用&#xff0c;传统营销模式正经历着前所未有的变革。本文旨在探讨开源AI智能名片微信小程序如何凭借其独特的功能特性&#xff0c;结合人性洞察、需求解决、资源优化以及…

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…

驰骋BPM RunSQL_Init SQL注入漏洞复现

0x01 产品简介 驰骋BPM系统由济南驰骋信息技术有限公司研发,具有悠久的历史和丰富的行业经验。其工作流引擎CCFlow自2003年开始研发,是国内知名的老牌工作流引擎,在BPM领域拥有广泛的研究群体与应用客户群。统提供.net与java两个版本,且两个版本的代码结构、数据库结构、设…

【学习笔记】Matlab和python双语言的学习(整数规划和0-1规划)

文章目录 前言一、整数规划和0-1规划二、典型示例1.背包问题2.指派问题 三、代码实现----Matlab1.Matlab 的 intlinprog 函数2.Matlab 代码背包问题指派问题 四、代码实现----python背包问题指派问题 总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频…