那些踩过的declared implicitly的坑

2023-11-19

缺少头文件

我的本意是想做串口打印进行调试,于是我在usart.c中重写了这两个函数,这里顺便记录下如何串口打印
usart.c中

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  return ch;
}

main函数之前

printf("Hello world!!!\n");

本来以为大功告成,结果出现了FILE没有定义,…/Core/Src/main.c(93): warning: #223-D: function “printf” declared implicitly 这些错误,本质上的原因是因为没有在uart.h 中声明 #include <stdio.h>,这主要是没有理解重定义函数的意义。
printf 定义在 <stdio.h> 头文件中,printf 函数根据 format 字符串给出的格式打印输出,stdout(标准输出)中,当然,printf 函数是不会一个字符一个字符去输出,它会调用更底层的 I/O 函数:fputc去逐个字符打印。fputc 也定义于头文件 <stdio.h>中。

添加好头文件后,几个常用的示例:

  char str[20];
  uint8_t ch;
  /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();

  /* 初始化串口并配置串口中断优先级 */
  MX_DEBUG_USART_Init();
  
  /* 调用格式化输出函数打印输出数据 */
  printf("Hello world!!!\n");
  
  /* sprintf函数把格式化的数据写入某个字符串  */  
  sprintf(str,"今天是个好日子,20%02d-%02d-%02d",15,10,04);  
  /* 调用格式化输出函数打印输出数据 */
  printf("%s\n",str);
  /* 无限循环 */
  while (1)
  {
    ch=getchar();
    HAL_UART_Transmit(&huart1,&ch,1,0);
  }

重复定义

这个我遇到过两种:
1 我本来是想写一个新的bsp,于是我把bsp_led.c和.h分别进行复制,改了个名字,结果没有修改。
ifdef 的用法

复制代码
#define   KEY1_PA0

#ifdef    KEY1_PA0
-------------第一段-----------------
#define               macKEY1_GPIO_CLK                      RCC_APB2Periph_GPIOA
#define               macKEY1_GPIO_PORT                     GPIOA              
#define               macKEY1_GPIO_PIN                        GPIO_Pin_0

#else    //KEY2_PC13
-------------第二段-----------------
#define               macKEY1_GPIO_CLK                      RCC_APB2Periph_GPIOC
#define               macKEY1_GPIO_PORT                     GPIOC          
#define               macKEY1_GPIO_PIN                        GPIO_Pin_13

#endif
复制代码

如果定义过KEY1_PA0,则执行第一段代码,如果没有,执行第二段。
ifndef 用法

#ifndef __USART1_H
#define    __USART1_H

//statement.

#endif  // usart1.h

如果没有define过__USART1_H,就执行下面的语句;如果定义过,就不执行;
所以在一个.c文件里面,多次调用到该文件的时候,就相当于只调用一次。
这是头文件的常用写法!!由于我没有更改,就出现了两个相同的头文件定义。

2 这是关于extern的用法
当有一个变量需要在多个文件中用到时,不能定义在头文件中,可能会导致重复定义,要把该变量定义在某个.c文件中,另一个需要用到该变量的.c或者.h文件在该变量的声明前加extern
我们看一个示例:这是hal库定义的例子
usart.c中定义

UART_HandleTypeDef huart1

usart.h中

extern UART_HandleTypeDef huart1;

这是正确的,但如果UART_HandleTypeDef huart1定义在了.h文件中,在main函数里和uart.c中都使用用了usart.h,出现了重复的定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

那些踩过的declared implicitly的坑 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板

随机推荐

  • Kerberos

    kerberos身份认证过程 第一步 账号和KDC互相认证 账号A向KDC证明自己的身份 1 账号A首先会把自己的密码hash 得到一把秘钥Kclt 2 Kclt会把当前的时间戳加密 生成一个字符串 使用 时间戳 Kclt来表示 3 将生成
  • SpringBoot打包docker镜像发布

    1 首先构建一个SpringBoot项目 只需要添加web依赖 2 编写一个controller用于测试 3 本机启动观察是否能够成功访问 4 打包 5 找到生成的jar包位置 6 jar包的启动运行测试 7 编写Dockerfile文件
  • 游戏服务器内存修改,修改游戏服务器内存

    修改游戏服务器内存 内容精选 换一换 实例支持自动化发放裸金属服务器 远程Console登录 支持租户自主管理裸金属服务器生命周期 查询 启动 关机 重启 删除 导出服务器列表 将租户名下的所有裸金属服务器信息 以CSV文件的形式导出至本地
  • 【SQL】6 SQL WHERE 子句

    WHERE 子句用于过滤记录 SQL WHERE 子句 WHERE 子句用于提取那些满足指定标准的记录 SQL WHERE 语法 SELECT column name column name FROM table name WHERE co
  • Docker Compass

    Docker Compose介绍 使用微服务架构的应用系统一般包含若干个微服务 每个微服务一般都会部署多个实例 如果每个微服务都要手动启停 那么效率之低 维护量之大可想而知 本节课将讨论如何使用 Docker Compose来轻松 高效地管
  • ICCV 2023

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 目标跟踪 微信交流群 作者 Jaraxxus 已授权转载 源 知乎 编辑 CVer https zhuanlan zhihu com p 6438354
  • 2018年区块链人才趋势:降温、调节、蓄势待发

    2018年 戊戌年 是一个不平静的年份 自960年前的戊戌年王安石变法 到最近两百年的四个戊戌年 其间发生的大事无不与 变革 息息相关 年初 从科技圈 金融圈里 引爆出一个叫 区块链 的公众热点 从技术角度而言 这并非新生事物 但因其巨大的
  • Linux网络服务管理&防火墙详解&端口问题

    每次配置访问服务器都会一团迷雾 今天来尝试弄清楚同时借鉴一下大佬的博文当做笔记 文章目录 防火墙简介 一 防火墙基础 二 iptables 防火墙策略 iptables 命令格式 iptables案例 1 查看开放的端口 2 开放端口 此处
  • 七、PXE高效批量网络装机

    七 PXE高效批量网络装机 PXE概述 PXE严格来说并不是一种安装方式 而是一种引导方式 进行 PXE 安装的必要条件是要安装的计算机中包含一个 PXE 支持的网卡 NIC 即网卡中必须要有 PXE Client PXE Pre boot
  • 如何在Linux系统上监测系统温度?(亲测可用)

    转载自 http os 51cto com art 201311 417208 htm 按理说 在大多数情况下 你用不着为电脑的运行温度而操心 除了制造瑕疵外 电脑硬件在设计时确保温度不会超过最高工作温度 但即使没有任何的硬件故障 也会由于
  • QT6源码编译全过程

    QT6源码编译全过程 windows环境下使用VS2019 QT6源码编译全过程 windows环境下使用VS2019 qt6 编译 刘亿辰的博客 CSDN博客 一 随记 QT作为一个跨平台的界面开发平台 经过了历史长河的洗礼以及一代代Qt
  • 【Windows系统】资源管理器右键卡顿案例

    问题 最近在使用办公电脑过程中 发现在Windows系统资源管理器中使用右键会出现卡顿现象 这是一台经常使用 工作日上班都会使用 以前没有这个问题 出现问题的环境 windows版本 win10 x64 22H2 解决方法 1 关闭映射到本
  • VUE之Echarts地图引入及配置项详解

    步骤 建立dom用于渲染地图组件 div style width 100 height 100 class map charts div 引入所需js文件 import echarts from echarts require echart
  • Unity中在场景中添加水资源效果的方法

    首先 导入系统自带的水资源包 鼠标右击Project视图中的Assets文件夹 在弹出来的列表中选择 Import Package gt Water Basic 然后 弹出一个 Importing package 窗口 自由选择其中的包 全
  • Python操作数据库

    pymysql模块简单实用 1 安装pymysql模块 pip3 install PyMySQL 2 建立连接 与MySQL服务端建立连接 conn pymysql connect host 127 0 0 1 ip port 3306 端
  • 因果模型五:用因果的思想优化风控模型——因果正则化评分卡模型

    因果模型五 用因果的思想优化风控模型 因果正则化评分卡模型 一 模型中的因果和相关 二 不可知样本选择偏差 三 因果推断 四 因果与评分卡的融合 五 模型效果评估 5 1 人工合成数据效果测试 5 2 YFCC100M图像数据测试 5 3
  • 高德地图打点获取点的坐标和名称

    一 首先引入地图 代码在最后 二 然后是打点获取坐标和名称的方法 代码在最后 重点 如果不加上密钥的话可能会得不到数据名称 你想要的代码来了 密钥 window AMapSecurityConfig securityJsCode 你申请ke
  • GraphPad Prism 9.2 Mac 2021最新安装使用教程

    GraphPad Prism集生物统计 化学统计 以及科技绘图于一身 其中医学所能用到的绘图需要它几乎都能满足 Prism 现在被各种生物学家以及社会和物理科学家广泛使用 超过110个国家的超过20万名科学家依靠 Prism 来分析 绘制和
  • SpringBoot学习遇到的问题(1) - 配置文件有日志的debug模式等配置项,为什么不起作用...

    这个问题困扰我近乎两天 通过查找N多资料后终于解决 写下来共享给大家 logging level root DEBUG 一系列的日志配置项 都不起作用的原因是springboot启动加载不到src main resources下的配置文件a
  • 那些踩过的declared implicitly的坑

    缺少头文件 我的本意是想做串口打印进行调试 于是我在usart c中重写了这两个函数 这里顺便记录下如何串口打印 usart c中 int fputc int ch FILE f HAL UART Transmit huart1 uint8