【问题标题】:Make clangd aware of macros given from the compiler让 clangd 知道编译器给出的宏
【发布时间】:2021-06-08 13:04:29
【问题描述】:

我有两个从同一源(客户端和服务器)构建的可执行文件,它们使用编译选项-D CLIENT=0 -D SERVER=1 用于服务器,-D CLIENT=1 -D SERVER=0 用于客户端。如果我做类似的事情

if (CLIENT) {
// Client specific code
}

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

【问题讨论】:

  • 是的,clang 编译得很好,问题出在语言服务器 clangd
  • 我建议使用#ifdef CLIENT#if CLIENT,而不是可能在运行时评估的if (CLIENT),具体取决于优化设置
  • 这不是使用编译时配置的最佳方式。你最好使用预处理器#ifdef/ifndef 指令来有条件地编译特定的代码部分。
  • 我发现if (CLIENT) 更易于阅读,如果可以,我会使用它。无论如何,它肯定会被任何现代编译器优化

标签: c clangd


【解决方案1】:

有没有办法让 clangd 知道这些宏?

来自getting started with 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-ish 开发。

compile_flags.txt

如果一个项目中的所有文件都使用相同的构建标志,你可以把那些 标志,每行一个标志,在源根目录的 compile_flags.txt 中。

Clangd 将假定编译命令是 clang $FLAGS some_file.cc。

手动创建此文件是一个合理的起点,如果您 项目很简单。

如果不移动到 cmake,请创建一个 compile_flags.txt 文件,其内容如下所示,clangd 应该选择此文件:

-DCLIENT=1
-DSERVER=1

【讨论】:

  • 如果你不使用cmake,你也可以使用Bear之类的东西来构建compile_commands.json。
猜你喜欢
  • 2014-01-21
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多