c++ Clangd LSP在dsound. h中显示未知类型名称“interface

a8jjtwal  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(256)

我刚开始写Win32应用程序,我在Neovim中编辑,我运行WSL,使用clangd作为LSP,编译时我使用Microsoft cl,它构建二进制文件很好。
我正在重构一些代码,当我把我的#include <dsound.h>从它原来的main.cpp移动到一个新的头文件(windows_sound. h)时,我遇到了一个奇怪的LSP错误。clang:在包含的文件中:未知类型名称“interface”。
这个错误即使是文件中唯一的东西(没有include guards)也会出现。但是,如果我把include移到一个空的.cpp(windows_sound. cpp)中,LSP不会给我任何错误。知道发生了什么吗?
My .clangd(指向MingW64的Windows头文件):

CompileFlags:
    Add:
        - "--target=x86_64-w64-windows-gnu"
        - "-std=c++20"
        - "-fms-extensions"
        - "Wall"
        - "-isystem/usr/share/mingw-w64/include/"

我的经典版本:15.0.6
nvim版本:0.8.0-1210
我在配置中做的唯一附加操作是将clangd命令修改为:

cmd =
{
    "clangd",
    "--header-insertion=never",
},
nxowjjhe

nxowjjhe1#

错误发生在.h中,但未发生在.cpp文件中,这可能表明clangd将.h文件视为C头文件,而不是C头文件。
一种解决方案是将头文件重命名为.hpp,这将其标识为C
头文件。
另一个解决方案是指示clangd将项目中的.h文件解析为C++头文件,方法是将以下代码添加到项目根目录中的.clangd file

If:
  PathMatch: .*\.h

CompileFlags:
  Add: [-xc++-header]

Clangd确实有一些启发式的方法来将.h文件归类为C++,例如,如果有一个文件具有相同的名称,但旁边有.cpp扩展名,它会将.h文件视为C++。plans可以扩展此启发式,以考虑项目中的实际包含关系(即,如果项目中的任何.cpp文件包含.h文件,则将其视为C++),但在此之前,可能需要上述两种解决方法之一。

相关问题