我一直在使用出色的C接口libclang(http://clang.llvm.org/doxygen/group__CINDEX.html)编写C ++ AST解析器。不幸的是,在C ++ 11范围内的枚举和老式的枚举之间似乎没有歧义:两者的游标类型为CXCursor_EnumDecl,并且类型为CXType_Enum Ie相同。
我曾尝试拜访孩子,看看他们的父母类型是否不同-遗憾的是没有。我试过询问底层类型,我都得到了一个整数。我检查了在Enum之后声明的所有项目,以查看是否可能出现老式的Enums绑定或typedef,再次没有明显区别。
我开始认为我一定会丢失一些东西。我是否必须使用代码完成API来确定它是哪种枚举?
因此,这是一个解决方案,尽管它不是很好,但可能会帮助其他人。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,则此解决方案可能会发生很多不好的事情。我不太在乎这个解决方案,但是它确实有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句