gpt4 book ai didi

clang 无法独立解析我的 .h 文件

转载 作者:行者123 更新时间:2023-12-04 11:07:38 29 4
gpt4 key购买 nike

我正在使用 libclang 的 python 绑定(bind),但我认为这个问题是由 libclang 而不是 python 绑定(bind)引起的。

我有一个标题 object.h

#ifndef OBJECT_H
#define OBJECT_H

class Object {
public:
int run();
};

#endif

还有一个实现 object.cpp
#include "object.h"

int Object::run() {
int a = 0;
return a*a;
}

如果我访问 object.h 的翻译单元的 AST ,最后一个 AST 节点是 VAR_DECL class Object就是这样。它不会访问 public:...部分。如果我使用 clang 直接检查语法会提示我的头文件是错误的。
$ clang -Xclang -ast-dump -fsyntax-only object/object.h
object/object.h:4:1: error: unknown type name 'class'
class Object {
^
object/object.h:4:13: error: expected ';' after top level declarator
class Object {
^
;
TranslationUnitDecl 0x7f816102d2d0 <<invalid sloc>>
|-TypedefDecl 0x7f816102d7d0 <<invalid sloc>> __int128_t '__int128'
|-TypedefDecl 0x7f816102d830 <<invalid sloc>> __uint128_t 'unsigned __int128'
|-TypedefDecl 0x7f816102db80 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]'
`-VarDecl 0x7f816102dbf0 <object/object.h:4:1, col:7> Object 'int' invalid
2 errors generated.

如果我从 object.cpp 开始使用 clang 转储,我不会有那个错误。
$ clang -Xclang -ast-dump -fsyntax-only object/object.cpp
TranslationUnitDecl 0x7fc6230302d0 <<invalid sloc>>
|-TypedefDecl 0x7fc623030810 <<invalid sloc>> __int128_t '__int128'
|-TypedefDecl 0x7fc623030870 <<invalid sloc>> __uint128_t 'unsigned __int128'
|-TypedefDecl 0x7fc623030c30 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]'
|-CXXRecordDecl 0x7fc623030c80 <object/object.h:4:1, line:7:1> class Object definition
| |-CXXRecordDecl 0x7fc623030d90 <line:4:1, col:7> class Object
| |-AccessSpecDecl 0x7fc623030e20 <line:5:1, col:7> public
| `-CXXMethodDecl 0x7fc623030ea0 <line:6:3, col:11> run 'int (void)'
`-CXXMethodDecl 0x7fc62307be10 parent 0x7fc623030c80 prev 0x7fc623030ea0 <object/object.cpp:3:1, line:6:1> run 'int (void)'
`-CompoundStmt 0x7fc62307c058 <line:3:19, line:6:1>
|-DeclStmt 0x7fc62307bf78 <line:4:3, col:12>
| `-VarDecl 0x7fc62307bf00 <col:3, col:11> a 'int'
| `-IntegerLiteral 0x7fc62307bf58 <col:11> 'int' 0
`-ReturnStmt 0x7fc62307c038 <line:5:3, col:12>
`-BinaryOperator 0x7fc62307c010 <col:10, col:12> 'int' '*'
|-ImplicitCastExpr 0x7fc62307bfe0 <col:10> 'int' <LValueToRValue>
| `-DeclRefExpr 0x7fc62307bf90 <col:10> 'int' lvalue Var 0x7fc62307bf00 'a' 'int'
`-ImplicitCastExpr 0x7fc62307bff8 <col:12> 'int' <LValueToRValue>
`-DeclRefExpr 0x7fc62307bfb8 <col:12> 'int' lvalue Var 0x7fc62307bf00 'a' 'int'

好像铿锵结合 object.h object.cpp然后一起做解析。
如果是这样,我如何获得 Object 的 ast 节点在 object.cpp 的第三行 int Object::run() { ?有一个 ast 节点吗?

这也让我很困惑,就像我访问 run() 时一样。 object.cpp 中的方法, 它会说当前位置在 object.cpp但范围在 object.h .程度究竟是什么意思?除了 libclang API 文档之外还有更简单的教程文档吗?

最佳答案

Clang 不知道您的 .h 中有 C++ 代码。文件。默认情况下,它处理 .h文件为纯 C。当您在 .cpp 上运行 clang 时文件,它知道它正在解析 C++。

有两种方法可以解决此问题。

  • 使用 -x 告诉 clang 文件中的语言是什么旗帜:
    clang -x c++ -Xclang -ast-dump -fsyntax-only object/object.h
  • 重命名您的文件以使用 .hh.hpp后缀。这些后缀告诉 clang 假设文件包含 C++ 代码。
    mv object/object.h object/object.hpp
    clang -Xclang -ast-dump -fsyntax-only object/object.hpp

    如果你重命名你的头文件,你需要改变你的#include要匹配的语句。
  • 关于clang 无法独立解析我的 .h 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19413156/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com