如何使用libclang检测枚举和范围枚举之间的区别?

时间:2014-10-02 19:25:21

标签: c++11 abstract-syntax-tree libclang

我使用优秀的C接口libclang(http://clang.llvm.org/doxygen/group__CINDEX.html)编写了一个C ++ AST解析器。不幸的是,C ++ 11范围的枚举和旧式枚举之间似乎没有消歧:两者都有一个游标类型CXCursor_EnumDecl和一个类型CXType_Enum I.e.相同。

我试过拜访孩子,看他们的父母类型是否不同 - 遗憾的是没有。我试过要求底层类型,我得到两个整数。我已经检查了Enum之后声明的所有项目,看看是否可能会出现旧式Enums的bind或typedef,再次没有明显区别。

我开始认为我必须遗漏一些东西。我是否必须使用代码完成API来确定它是哪种枚举?

1 个答案:

答案 0 :(得分:3)

所以这是一个解决方案,虽然它不是很好,但它可能会帮助其他人。 CXCursor是一个如下所示的结构:

typedef struct {
  enum CXCursorKind kind;
  int xdata;
  const void *data[3];
} CXCursor;

目前,void * data [3]映射到{const clang :: Decl * Parent,const clang :: Stmt * S,CXTranslationUnit TU}。知道了这一点,我们就可以编写从libclang C状态中提取内部clang C ++对象的代码:

#include "clang/AST/Decl.h"
bool isScoped=false;
{
  using namespace clang;
  const Decl *D = static_cast<const Decl *>(cursor.data[0]);
  if(const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D))
  {
    isScoped=TD->isScoped();
  }
}

如果你的clang标头偏离你的libclang,这个解决方案可能会发生很多坏事。我不太关心这个解决方案,但确实有效。