我有两个可执行文件,它们是从同一个源代码(一个客户端和一个服务器端)构建的,它们是用服务器端的-D CLIENT=0 -D SERVER=1和客户端的-D CLIENT=1 -D SERVER=0编译选项构建的。
-D CLIENT=0 -D SERVER=1
-D CLIENT=1 -D SERVER=0
if (CLIENT) { // Client specific code }
clangd抱怨没有定义CLIENT。有没有办法让clangd知道这些宏?(代码编译得很好,错误来自clangd,而不是编译器)
clangd
izj3ouym1#
有没有办法让clangd知道这些宏?从clangd开始:
为了理解项目中的源代码,clangd需要知道构建标志(这是C++的一个现实,源文件不是自包含的)。默认情况下,clangd会假设源代码是以clang some_file.cc的形式构建的,您可能会收到关于缺少#included文件等虚假错误。有几种方法可以解决这个问题。
compile_commands.json文件为项目中的所有源文件提供编译命令。该文件通常由构建系统或与构建系统集成的工具生成。Clangd会在您编辑的文件的父目录中查找该文件。其他工具也可以生成该文件。请参阅compile_commands.json规范。compile_commands.json通常由CMake构建系统生成,但更多构建系统尝试生成它。我建议将你的项目转移到CMake,在这个过程中,你将学习这个工具,它肯定会帮助你进一步的C语言开发。
compile_commands.json
如果项目中的所有文件都使用相同的构建标志,则可以将这些标志(每行一个标志)放在源根目录的compile_flags.txt中。Clangd将假定编译命令是clang $FLAGS some_file. cc。如果您的项目非常简单,那么手动创建此文件是一个合理的起点。如果不移动到cmake,请创建一个compile_flags.txt文件,其内容如下所示,clangd应该选择此文件:
compile_flags.txt
-DCLIENT=1 -DSERVER=1
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:
Diagnostics: Suppress: pp_hash_error
当然,我们可以直接禁止 undeclared_var_use,而不需要在源代码中进行安全检查。但是,我们可以说,它隐藏真实的错误的风险很高,而显式的#error调用很少会对 clangd 感兴趣。
#error
2条答案
按热度按时间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
应该选择此文件:yws3nbqq2#
为什么不让 clangd 知道它们,而是让错误消息被抑制呢?因为并不总是希望切换构建系统,也不总是欢迎向所有代码库添加不必要的文件。
很少有人会反对添加这样的安全检查,提供更清晰的错误消息:
有了这些,就可以在一个 clangd.yaml 文件中抑制 pp_hash_error:
当然,我们可以直接禁止 undeclared_var_use,而不需要在源代码中进行安全检查。但是,我们可以说,它隐藏真实的错误的风险很高,而显式的
#error
调用很少会对 clangd 感兴趣。