最近一直在用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文件,內容基本一致。