为什么 libclang 会错误解析带有 .h 前缀的 C++ 头文件?

标准委员会

我试图用 libclang 解析一个 c++ 头文件,但解析器只解析了类名 - 并将其类型显示为 VarDec1。当文件扩展名从 .h 更改为 .cpp 时,它就可以正常工作。经过几天的搜索,我找不到答案,有人能帮我解决这个问题吗?

以下是 parser.cpp:

#include <iostream>
#include <clang-c/Index.h>  // This is libclang.
using namespace std;

ostream& operator<<(ostream& stream, const CXString& str)
{
  stream << clang_getCString(str);
  clang_disposeString(str);
  return stream;
}

int main()
{
  CXIndex index = clang_createIndex(0, 0);
  CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "tt.h", nullptr, 0,
    nullptr, 0,
    CXTranslationUnit_None);
  if (unit == nullptr)
  {
    cerr << "Unable to parse translation unit. Quitting." << endl;
    exit(-1);
  }

  CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
    cursor,
    [](CXCursor c, CXCursor parent, CXClientData client_data)
    {
      cout << "Cursor '" << (clang_getCursorSpelling(c)) << "' of kind '"
        <<(clang_getCursorKindSpelling(clang_getCursorKind(c))) << "'\n";
      return CXChildVisit_Recurse;
    },
    nullptr);

  clang_disposeTranslationUnit(unit);
  clang_disposeIndex(index);
  fgetc(stdin);
}

以下是 tt.h:

class MyClass
{
public:
  int field;
  virtual void method() const = 0;

  static const int static_field;
  static int static_method(int a1);
};

class MyClass2
{
public:
  int field;
  virtual void method() const = 0;

  static const string static_field;
  static int static_method(int a1, string a2);
};

我使用以下编译命令:

clang++ main.cpp -lclang

当文件扩展名为 .h 时:解析头

当文件扩展名为 .cpp 时:在此处输入图像描述

tt.h被 libclang 视为 C 文件,而不是 C++ 文件,因为文件类型严格基于扩展名。如果您希望将其解析为 C++ 文件,则需要使用 libclang 识别为 C++ 扩展名的扩展名(我认为.hh可以),或者您需要使用 command_line_args/num_command_line_args 参数显式设置扩展名:

/* Untested */
const char *command_line_args[] = {"-x", "c++", 0};
CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "tt.h", 
    command_line_args,
    (sizeof command_line_args / sizeof *command_line_args) - 1,
    nullptr, 0,
    CXTranslationUnit_None);

您可能还想从CXTranslationUnit. 也许,这会给你一个关于发生了什么的好线索。请参阅clang_getDiagnostic

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用libclang加速解析C ++代码?

Linux上的<conio.h>头文件在哪里?为什么找不到<conio.h>?

为什么C ++需要单独的头文件?

为什么有头文件和.cpp文件?

无法打开包含文件'afxwin.h':vs 2013 C ++中没有此类头文件或目录

C源文件包含其自己的头文件有什么好处

为什么标准库在.c文件而不是头文件中具有#include <...>

为什么需要C ++头文件的包含保护?

缺少ANSI C的头文件<tools / debug.h>?

为什么在线C ++ IDE不支持“ graphics.h”头文件?

为什么Libclang无法获得在头文件中定义的函数的定义?

Visual Studio C ++如何在前缀文件夹中添加头文件

为什么C头文件中的全局变量定义有效?

没有头文件的C / C ++程序

在C#中解析C头文件

C ++头文件解析

有关C中assert.h头文件的说明

是什么提供了名为curses.h的curses头文件?

为什么/ etc中的某些文件带有数字前缀?

任何具有内部链接的内容都可以放在C ++的头文件中。为什么?

为什么带有头文件的makefile不起作用?

为什么在2个.CPP文件中包含此头文件(带有头保护)会导致命名冲突?

预处理器指令:为什么带有#define 的头文件的标识符与头文件名不同

在Objective-C中,头文件和实现文件中的导入有什么区别?

包含没有“.h”格式的头文件

为什么在我的 .c 文件中尝试使用头文件中的结构时会出现类型错误?

为什么 (const char * ) 参数在 C 头文件 stdio.h 中的 fopen 原型中

为什么我的文件在 C 中分叉时即使有守卫也执行两次这个头文件?

你能用带有 .h 扩展名的 clang-cl 编译 C++ 头文件吗?