如何使用libclang检测枚举和作用域枚举之间的差异?

9
我一直在使用优秀的C接口libclang(http://clang.llvm.org/doxygen/group__CINDEX.html)编写C++ AST解析器。不幸的是,C++11作用域枚举和旧式枚举之间似乎没有区别:它们都具有CXCursor_EnumDecl的游标类型和CXType_Enum的类型,即相同。
我尝试访问子元素以查看其父类型是否不同 - 不幸的是没有。我尝试询问底层类型,我得到两个整数。我检查了枚举后声明的所有项,以查看是否可能出现绑定或typedef,但仍然没有明显的区别。
我开始觉得我可能漏掉了什么。我必须使用代码完成API来确定它是哪种类型的枚举吗?
1个回答

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不一致,那么使用这种解决方案可能会出现很多问题。我并不太喜欢这个解决方案,但它确实有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接