使clangd知道编译器给出的宏

whhtz7ly  于 2023-03-29  发布在  其他
关注(0)|答案(2)|浏览(171)

我有两个可执行文件,它们是从同一个源代码(一个客户端和一个服务器端)构建的,它们是用服务器端的-D CLIENT=0 -D SERVER=1和客户端的-D CLIENT=1 -D SERVER=0编译选项构建的。

if (CLIENT) {
// Client specific code
}

clangd抱怨没有定义CLIENT。有没有办法让clangd知道这些宏?(代码编译得很好,错误来自clangd,而不是编译器)

izj3ouym

izj3ouym1#

有没有办法让clangd知道这些宏?
从clangd开始:

项目设置

为了理解项目中的源代码,clangd需要知道构建标志(这是C++的一个现实,源文件不是自包含的)。
默认情况下,clangd会假设源代码是以clang some_file.cc的形式构建的,您可能会收到关于缺少#included文件等虚假错误。有几种方法可以解决这个问题。

compile_commands.json

compile_commands.json文件为项目中的所有源文件提供编译命令。该文件通常由构建系统或与构建系统集成的工具生成。Clangd会在您编辑的文件的父目录中查找该文件。其他工具也可以生成该文件。请参阅compile_commands.json规范。
compile_commands.json通常由CMake构建系统生成,但更多构建系统尝试生成它。
我建议将你的项目转移到CMake,在这个过程中,你将学习这个工具,它肯定会帮助你进一步的C语言开发。

compile_flags.txt

如果项目中的所有文件都使用相同的构建标志,则可以将这些标志(每行一个标志)放在源根目录的compile_flags.txt中。
Clangd将假定编译命令是clang $FLAGS some_file. cc。
如果您的项目非常简单,那么手动创建此文件是一个合理的起点。
如果不移动到cmake,请创建一个compile_flags.txt文件,其内容如下所示,clangd应该选择此文件:

-DCLIENT=1
-DSERVER=1
yws3nbqq

yws3nbqq2#

为什么不让 clangd 知道它们,而是让错误消息被抑制呢?因为并不总是希望切换构建系统,也不总是欢迎向所有代码库添加不必要的文件。
很少有人会反对添加这样的安全检查,提供更清晰的错误消息:

#ifndef CLIENT
#error "CLIENT undeclared. Must be set when building."
#define CLIENT 0
#endif

#ifndef SERVER
#error "SERVER undeclared. Must be set when building."
#define SERVER 0
#endif

有了这些,就可以在一个 clangd.yaml 文件中抑制 pp_hash_error

  • clangd.yaml*:
Diagnostics:
  Suppress: pp_hash_error

当然,我们可以直接禁止 undeclared_var_use,而不需要在源代码中进行安全检查。但是,我们可以说,它隐藏真实的错误的风险很高,而显式的#error调用很少会对 clangd 感兴趣。

相关问题