我使用优秀的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来确定它是哪种枚举?
答案 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,这个解决方案可能会发生很多坏事。我不太关心这个解决方案,但确实有效。