附注我很难为这个问题找到合适的标题......
在 CPython 项目中使用
clangd
时,我面临着挑战:
在上面显示的带注释的屏幕截图中,宏
PyObject_HEAD
在“include/object.h”内定义。它暴露于例如“cpython/funcobject.h”,因为 object.h 始终会首先包含在内。请注意,“cpython/funcobject.h”本身没有任何包含内容(可能是由于潜在的循环引用)。
包含的顺序由“include/Python.h”(API 标头)确保。因此编译器可以很好地使用它。
但是,clangd 会抱怨这一点,因为它无法弄清楚在哪里可以找到该符号。我当前的解决方法是为 clangd 添加以下配置:
# .clangd
CompileFlags:
Add: [-include, /include/Python.h]
然而,这产生了一个新的潜在问题。例如,“lock.h”(包含在第 71 行)应该 not 可以访问在“object.h”中定义的宏
PyObject_HEAD
,该宏定义在稍后包含(第 72 行)。
而且,这个配置的范围太大了:
clangd
会将此规则应用到项目内的所有头文件和源文件。并非所有这些都应该注入这个额外的标头。
问题来了:
clangd
,以便精确跟踪符号的来源和可用性?请注意:责怪编码风格不是一个可接受的答案。
是否有更强大的方法来配置 clangd,以便它精确跟踪符号的来源和可用性?
目前没有。这是一个广泛要求的功能,可在 https://github.com/clangd/clangd/issues/45 中跟踪。
该票证是开放的,可供有兴趣提供修复程序的人使用。请注意,正如问题线程中所讨论的,修复有些复杂。