2014-10-02 80 views
8

我一直在使用卓越的C接口libclang(http://clang.llvm.org/doxygen/group__CINDEX.html)编写C++ AST分析器。不幸的是,在C++ 11范围的枚举和老式的枚举之间似乎没有消歧义:它们都有一个游标类型CXCursor_EnumDecl和一个类型CXType_Enum I.e.相同。如何检测使用libclang的枚举和范围枚举之间的区别?

我曾试着去看孩子,看他们的父母是不同的 - 可悲的是。我试过要求基础类型,我得到了一个整数。我已经检查了Enum之后声明的所有项目,以查看是否可能会出现旧式的枚举bind或typedef,再次没有区别。

我开始认为我必须缺少一些东西。我是否必须使用代码完成API来确定它是哪种类型的Enum或什么?

回答

3

所以这里有一个解决方案,虽然它不是很棒,但它可以帮助其他人。甲CXCursor是寻找这样一个结构:

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

目前,void *的数据[3]映射到{常量铛:: *申报父,常量铛::语句* S,CXTranslationUnit TU}。知道了这些,我们就可以编写代码提取内部铛C从当前libclangÇ状态++对象:

#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(); 
    } 
} 

很多坏事可以用此溶液发生,如果您铛头从libclang偏离。我不太在意这个解决方案,但它确实有效。