解决vscode打开一个单片机工程文件(IAR/keil MDK)因无法找到头文件导致的结构体成员不自动补全问题。

article/2025/6/8 20:04:44

最近一直在用vscode安装c/c++插件后编辑STM32标准库(keil MDK)项目源文件,因为我感觉vscode在代码编辑方面比keil MDK本身优秀太多。发现打开工程后,结构体变量的成员在输入“.”后不自己弹出的问题,后来查找各方资料,发现是因为有好多头文件vscode自身无法找到。现在对整个过程做一下总结。

第0步:问题现象

第一步:检查C/C++ 插件配置正确(自动补全选择默认)

第二步:鼠标右键打开工程文件

第三步:右键编辑区---》选择“命令面板”---》C/C++配置(UI)

这个时候会自动生成一个“.vscode”的文件夹,并且自动生成一个“c_cpp_properties.json”的配置文件。

第四步:修改“c_cpp_properties.json”内容:

最后一个include是解决“stdlib.h”等环境头文件无法找到问题,需要根据自己安装路径添加。

最后添加宏定义,这里我是根据另外一篇博客添加的

如何解决VS Code打开Keil项目源码文件时显示红色波浪线的问题?-CSDN博客

"STM32F10X_MD",
"USE_STDPERIPH_DRIVER",
"__CC_ARM",
"__arm__",
"__align(x)=",
"__ALIGNOF__(x)=",
"__alignof__(x)=",
"__asm(x)=",
"__forceinline=",
"__restrict=",
"__global_reg(n)=",
"__inline=",
"__int64=long long",
"__INTADDR__(expr)=0","__irq=",
"__packed=",
"__pure=",
"__smc(n)=",
"__svc(n)=",
"__svc_indirect(n)=",
"__svc_indirect_r7(n)=",
"__value_in_regs=",
"__weak=",
"__writeonly=",
"__declspec(x)=",
"__attribute__(x)=",
"__nonnull__(x)=",
"__register=",
"__breakpoint(x)=",
"__cdp(x,y,z)=",
"__clrex()=",
"__clz(x)=0U",
"__current_pc()=0U",
"__current_sp()=0U",
"__disable_fiq()=",
"__disable_irq()=",
"__dmb(x)=",
"__dsb(x)=",
"__enable_fiq()=",
"__enable_irq()=",
"__fabs(x)=0.0",
"__fabsf(x)=0.0f",
"__force_loads()=",
"__force_stores()=",
"__isb(x)=",
"__ldrex(x)=0U",
"__ldrexd(x)=0U",
"__ldrt(x)=0U",
"__memory_changed()=",
"__nop()=",
"__pld(...)=",
"__pli(...)=",
"__qadd(x,y)=0",
"__qdbl(x)=0",
"__qsub(x,y)=0",
"__rbit(x)=0U",
"__rev(x)=0U",
"__return_address()=0U",
"__ror(x,y)=0U",
"__schedule_barrier()=",
"__semihost(x,y)=0",
"__sev()=",
"__sqrt(x)=0.0",
"__sqrtf(x)=0.0f",
"__ssat(x,y)=0",
"__strex(x,y)=0U",
"__strexd(x,y)=0",
"__strt(x,y)=",
"__swp(x,y)=0U",
"__usat(x,y)=0U",
"__wfe()=",
"__wfi()=",
"__yield()=",
"__vfp_status(x,y)=0"

需要注意的是:第一个第二个宏定义需要与keil MDK或这IAR中设置保持一致。下图是我用的标准库以及使用了stm32f103c8t6单片机。所以需要定义宏“STM32F10X_MD”,"USE_STDPERIPH_DRIVER"。

最终版的c_cpp_properities.json文件如下:

{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","D:\\Program Files (x86)\\MDK\\ARM\\ARMCC\\include"],"defines": ["STM32F10X_MD","USE_STDPERIPH_DRIVER","__CC_ARM","__arm__","__align(x)=","__ALIGNOF__(x)=","__alignof__(x)=","__asm(x)=","__forceinline=","__restrict=","__global_reg(n)=","__inline=","__int64=long long","__INTADDR__(expr)=0","__irq=","__packed=","__pure=","__smc(n)=","__svc(n)=","__svc_indirect(n)=","__svc_indirect_r7(n)=","__value_in_regs=","__weak=","__writeonly=","__declspec(x)=","__attribute__(x)=","__nonnull__(x)=","__register=","__breakpoint(x)=","__cdp(x,y,z)=","__clrex()=","__clz(x)=0U","__current_pc()=0U","__current_sp()=0U","__disable_fiq()=","__disable_irq()=","__dmb(x)=","__dsb(x)=","__enable_fiq()=","__enable_irq()=","__fabs(x)=0.0","__fabsf(x)=0.0f","__force_loads()=","__force_stores()=","__isb(x)=","__ldrex(x)=0U","__ldrexd(x)=0U","__ldrt(x)=0U","__memory_changed()=","__nop()=","__pld(...)=","__pli(...)=","__qadd(x,y)=0","__qdbl(x)=0","__qsub(x,y)=0","__rbit(x)=0U","__rev(x)=0U","__return_address()=0U","__ror(x,y)=0U","__schedule_barrier()=","__semihost(x,y)=0","__sev()=","__sqrt(x)=0.0","__sqrtf(x)=0.0f","__ssat(x,y)=0","__strex(x,y)=0U","__strexd(x,y)=0","__strt(x,y)=","__swp(x,y)=0U","__usat(x,y)=0U","__wfe()=","__wfi()=","__yield()=","__vfp_status(x,y)=0"]}],"version": 4
}

最终效果:

最后总结:其实结构体成员无法自动补全,无法打开头文件对应的是同一个问题就是vscode自身无法找到头文件的原因。通过自己创建c_cpp_properities.json可以完美解决此类问题。

补充:使用vscode打开IAR工程也是相同的做法:添加c_cpp_properties.json文件,内容基本一致。


http://www.hkcw.cn/article/elhuNOdMkT.shtml

相关文章

Cursor快速梳理ipynb文件Prompt

1. 整体鸟瞰 请在不运行代码的前提下&#xff0c;总结 <文件名.ipynb> 的主要目的、核心逻辑流程和输出结果。阅读整个项目目录&#xff0c;列出每个 .ipynb / .py 文件的角色&#xff0c;以及它们之间的数据依赖关系&#xff08;输入→处理→输出&#xff09;。2. 结构…

Linux --进程优先级

概念 什么是进程优先级&#xff0c;为什么需要进程优先级&#xff0c;怎么做到进程优先级这是本文需要解释清楚的。 优先级的本质其实就是排队&#xff0c;为了去争夺有限的资源&#xff0c;比如cpu的调度。cpu资源分配的先后性就是指进程的优先级。优先级高的进程有优先执行的…

Web后端快速入门(Maven)

Maven是apche旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 开源项目&#xff1a;Welcome to The Apache Software Foundation. Maven的作用&#xff1a; 依赖管理&#xff08;方便快捷的管理项目依赖的资源&#xff0c;避免版本冲突问题&#xff09…

工业透明材料应力缺陷难检测?OAS 软件应力双折射案例来解决

应力双折射案例分析 简介 应力是物体内部力的分布状态&#xff0c;反映了物体材料中相邻部分之间的相互作用力。对于透明各向同性光学元件而言&#xff0c;在应力作用下会表现出暂时的双折射特性&#xff0c;这种特性使得光线在元件内部传播时&#xff0c;会分解为两束具有不同…

C# winform教程(二)----button

一、button的使用方法 主要使用方法几乎都在属性内&#xff0c;我们操作也在这个界面 二、作用 用户点击时触发事件&#xff0c;事件有很多种&#xff0c;可以根据需要选择。 三、常用属性 虽然属性很多&#xff0c;但是常用的并不多 3.常用属性 名称内容含义AutoSize自动调…

yzncms系统验证码关闭以及验证码后台配置功能

问题&#xff1a;yzncms系统的验证码如何关闭&#xff0c;以及怎么在后台配置参数呢&#xff1f; 回答&#xff1a;目前yzncms系统的验证码是没有后台配置功能的&#xff0c;也没有关闭功能&#xff0c;只能靠自己在源码里修改配置参数。 不过&#xff0c;不要着急&#xff0…

如何制定数字化转型策略:从理念到落地的全面指南

在当今快速变化的商业环境中&#xff0c;数字化转型&#xff08;DX&#xff09;已成为企业保持竞争力和实现可持续发展的关键。然而&#xff0c;很多企业在推进数字化转型时常常感到无从下手。今天小编就来为大家梳理一下如何制定一套科学且可行的数字化转型策略&#xff0c;助…

阿姆达尔定律的演进:古斯塔夫森定律

前言 在上一篇文章《使用阿姆达尔定律来提升效率》中提到的阿姆达尔定律前提是假设问题的规模保持不变&#xff0c;并且给定一台速度更快的机器&#xff0c;目标是更快地解决问题。然而&#xff0c;在大多数情况下&#xff0c;这并不完全正确。当有一台更快的机器时&#xff0…

Qt 仪表盘源码分享

Qt 仪表盘源码分享 一、效果展示二、优点三、源码分享四、使用方法 一、效果展示 二、优点 直观性 数据以图表或数字形式展示&#xff0c;一目了然。用户可以快速获取关键信息&#xff0c;无需深入阅读大量文字。 实时性 仪表盘通常支持实时更新&#xff0c;确保数据的时效性。…

吞咽与营养并重:进行性核上性麻痹的饮食之道

进行性核上性麻痹是一种罕见的神经系统变性疾病&#xff0c;患者常出现吞咽困难、肢体运动障碍等症状&#xff0c;合理饮食对改善患者营养状况、延缓病情发展至关重要。以下为进行性核上性麻痹患者量身定制的健康饮食方案。 ​患者饮食需遵循 “细软易消化、均衡营养、少食多餐…

leetcode hot100 链表(二)

书接上回&#xff1a; leetcode hot100 链表&#xff08;一&#xff09;-CSDN博客 8.删除链表的倒数第N个结点 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* currhead;int len0;while(curr){currcurr->next;len;}int poslen-n…

结构性设计模式之Composite(组合)

结构性设计模式之Composite&#xff08;组合&#xff09; 摘要&#xff1a; Composite&#xff08;组合&#xff09;模式通过树形结构表示"部分-整体"层次关系&#xff0c;使得用户能够统一处理单个对象和组合对象。该模式包含Component&#xff08;组件接口&#x…

【Typst】4.导入、包含和读取

概述 上节概述了Typst脚本的基础语法&#xff0c;在此基础上&#xff0c;本节介绍Typst文件的导入、包含和读取的内容。你将可以更简单灵活的组织你的文件内容。 系列目录 1.Typst概述2.Typst标记语法和基础样式3.Typst脚本语法4.导入、包含和读取5.文档结构元素与函数6.布局…

深入解析C++引用:从别名机制到函数特性实践

1.C引用 1.1引用的概念和定义 引用不是新定义⼀个变量&#xff0c;而是给已存在变量取了⼀个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同⼀块内存空间。比如四大名著中林冲&#xff0c;他有一个外号叫豹子头&#xff0c;类比到C里就…

【vue+ts】找不到模块“./App.vue”或其相应的类型声明

报错&#xff1a;找不到模块“./App.vue”或其相应的类型声明。 原因&#xff1a;typescript只能理解.ts文件&#xff0c;无法理解.vue文件。 解决&#xff1a;在src/env.d.ts下添加&#xff1a; /// <reference types"vite/client" /> // 三斜线引用告诉编译…

HTTP Error 400 Bad request 问题分析解决

文章目录 1.问题描述&#xff1a;2.异常信息如下&#xff1a;3.分析异常信息&#xff1a;4.总结&#xff1a; 1.问题描述&#xff1a; 前端保存老是报错HTTP ERROR 400 Bad Request。经过异常分析得出是前端传参导致的后端框架的验证拦截&#xff0c;包的错误。 2.异常信息如下…

数据库的操作

1.查看数据库 show databases; 2.库的创建 create database [IF NOT EXITS] db_name [creat_specification];[]内的是可选选项&#xff0c;IF NOT EXIT表示如果数据库名为db_name的数据库存在就创建数据库&#xff0c;否则就不创建&#xff0c;creat_specification是创建的特…

IP话机和APP拨打电话的区别

‌IP话机和IP电话App&#xff08;如Zoom Phone、Microsoft Teams、Skype等&#xff09;均基于互联网协议&#xff08;VoIP&#xff09;技术实现通话&#xff0c;但在硬件形态、使用场景、功能侧重等方面存在显著差异。以下是主要区别&#xff1a; 1. 硬件形态与部署 IP话机 物…

el-select 实现分页加载,切换也数滚回到顶部,自定义高度

el-select 实现分页加载&#xff0c;切换也数滚回到顶部&#xff0c;自定义高度 1.html <el-form-item label"俱乐部&#xff1a;" prop"club_id" label-width"120px"><el-select :disabled"Boolean(match_id)" style"w…

帝可得- 人员管理

一.需求说明 人员管理业务流程如下&#xff1a; 登录系统&#xff1a; 首先&#xff0c;后台管理人员需要登录到帝可得后台管理系统中。 新增工作人员&#xff1a; 登录系统后&#xff0c;管理人员可以新增工作人员&#xff0c;包括姓名、联系方式等信息。 关联角色&#xf…