如何在VSCode+Clangd+CMake环境中忽略指定文件的错误?
在VSCode+Clangd+CMake环境中忽略特定文件的错误
我使用VSCode的Clangd插件搭配CMake开发C语言项目,Clangd自带clang-tidy静态检测功能,但目前仅能忽略警告,无法直接忽略特定文件的错误。我的settings.json配置如下:
"clangd.arguments": [ "--log=verbose", "--compile-commands-dir=${workspaceFolder}/build", "--query-driver=D:\\000_soft\\mingw\\bin\\", ],
问题源于ST的core_m4.h文件中部分嵌入式汇编语法和编译器宏定义不被当前Clangd配置支持,例如这段代码:
#if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #define __STATIC_INLINE static __inline #elif defined ( __GNUC__ ) #define __ASM __asm /*!< asm keyword for GNU Compiler */ #define __INLINE inline /*!< inline keyword for GNU Compiler */ #define __STATIC_INLINE static inline #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for IAR Compiler */ #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ #define __STATIC_INLINE static inline #elif defined ( __TMS470__ ) #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ #define __STATIC_INLINE static inline #elif defined ( __TASKING__ ) #define __ASM __asm /*!< asm keyword for TASKING Compiler */ #define __INLINE inline /*!< inline keyword for TASKING Compiler */ #define __STATIC_INLINE static inline #elif defined ( __CSMC__ ) #define __packed #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ #define __STATIC_INLINE static inline #endif __STATIC_INLINE void __set_CONTROL(uint32_t control) { register uint32_t __regControl __ASM("control"); __regControl = control; }
解决方案
方法1:修复Clangd的目标架构配置(推荐)
报错核心原因是当前Clangd使用x86架构的Mingw编译器,无法识别ARM架构的汇编语法。调整配置适配ARM目标:
修改settings.json中的clangd.arguments,添加ARM目标参数并指向ARM交叉编译器:
"clangd.arguments": [ "--log=verbose", "--compile-commands-dir=${workspaceFolder}/build", "--query-driver=D:\\path\\to\\arm-none-eabi-gcc.exe", // 替换为你的ARM交叉编译器路径 "--target=arm-none-eabi", // 指定ARM目标架构 ],
这样Clangd就能正确识别ARM的寄存器和汇编语法,从根源消除错误。
方法2:通过.clangd配置文件忽略特定文件的所有诊断
若无法修改编译器配置,可在项目根目录创建.clangd文件,配置忽略core_m4.h的所有错误和警告:
Diagnostics: Suppress: - File: "**/core_m4.h" // 匹配项目中所有路径下的core_m4.h All: true // 忽略该文件的所有诊断信息
方法3:在代码中添加诊断忽略指令(不推荐修改原厂头文件)
若允许修改头文件,可在core_m4.h的开头和结尾添加Clang诊断指令:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-w" // 忽略所有诊断 // 原core_m4.h内容... #pragma clang diagnostic pop // 恢复诊断
建议复制一份修改后的头文件到项目中,避免修改ST原厂文件。
内容的提问来源于stack exchange,提问作者kanghao chen
相关产品推荐
相关产品推荐

