目标:如果我有两个 c 文件,A 和 B,并且我不打算将 B 编译成目标文件,而是直接将其包含在 A 中,clangd(或与 Kate 一起使用的任何其他 LSP 服务)可以告诉我只有直接编译 A 时出现的 B 中的错误吗?也就是说,A是B中编译错误的“入口文件”。
请与我谈谈对标准包含做法的冷落。
最简单的例子:假设这是 main.c:
#include <stdio.h>
#include "test.c"
int main() {
test();
return 0;
}
test.c 是:
void test() {
printf("Hello world!\n");
}
如果我将 test.c 编译成目标文件,我会得到以下错误:
> clang -c test.c -o test
test.c:2:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)' [-Wimplicit-function-declaration]
printf("Hello world!\n");
^
test.c:2:5: note: include the header <stdio.h> or explicitly provide a declaration for 'printf'
Kate 的 LSP 服务器当然会注意到这一点,并在 test.c 中突出显示“printf”以进行修复。
现在,假设我不打算单独编译 test.c。我只想运行:
clang main.c
在 stdio 包含在 main.c 中之后,它将包含 test.c,因此编译不会出现错误。因此,LSP 服务器向我显示的 printf 警告(虽然有利于单独演示 test.c 的编译能力),但与我最终如何编译程序无关。
在这种情况下,我可以告诉LSP服务器仅编译main.c(将main.c视为编译的“入口点”),然后让kate仅突出显示test.c中因编译main而产生的错误。 C?在具体示例中,这将导致 test.c 中不会突出显示任何错误。
我也可能会冷落“入口点”的定义,因为它通常指的是运行时入口点,而不是某些编译选择,但如果有我所要求的名称,我不确定它是什么。
答案1
我能想到的唯一方法是手动修改compile_commands.json
数据库并从数据库中排除第二个文件。
或者,您可以通过clangd
配置来完成此操作,请参阅这里。