有一种方法可以将C/C++库作为一个仅包含头文件的文件分发.库在一个library.h文件中:头声明和实现一起隐藏在#ifdef LIBRARY_IMPL下面.您需要创建一些执行#define LIBRARY_IMPL; #include "library.h".c/.cpp文件,这将创建带有实现的编译单元.

我有一个项目,它广泛使用这样的库.项目构建系统创建compile_commands.json,然后clangd使用它来向VSCode(具有llvm-vs-code-extensions.vscode-clangd)提供项目路径、数据 struct 和提示.

我的问题是,当打开library.h文件进行编辑时,符号LIBRARY_IMPL没有定义,因此#ifdef LIBRARY_IMPL部分被视为注释-没有语法突出显示、类型判断等.

有没有一种方法可以告诉clangd或扩展名在编译library.c包装器文件而不是独立的.h文件时将文件视为原样?

推荐答案

一种简单的方法是在项目的根目录中创建一个.clangd文件,其中包含:

CompileFlags:
  Add: [-DLIBRARY_IMPL]

这将指示clangd将标志-DLIBRARY_IMPL(具有定义宏LIBRARY_IMPL的效果)添加到打开项目中的文件时使用的任何编译命令.

请注意,要使其有效,library.h需要位于项目的目录树中(因为.clangd文件将仅应用于该目录树中的文件).

如果library.h位于项目目录之外,另一种方法是创建一个包含相同内容的user config file,但这一次您可能希望将其设置为文件路径的条件:

If:
  PathMatch: /path/to/library/library.h

CompileFlags:
  Add: [-DLIBRARY_IMPL]

你可以在https://clangd.llvm.org/config.html上阅读更多关于clangd配置文件的内容.

C++相关问答推荐

错误:在.h程序中重新定义 struct

常数函数指针优化

为什么输出不是从上到下C

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

限制不同类型的限定符

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

如何使用C++在控制台中以彩色打印被阻止的客户端

S在本文中的价值观到底出了什么问题?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

无法访问共享目标文件内的共享指针

-Wnonnull-Compare警告不是具有误导性吗?

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

'printf("%s", user_input)' 危险吗?

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

将数组返回到链表

C 中从 Unix 纪元时间转换的损坏

C 中类型说明符的顺序重要吗?

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果