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

尼尔·道格拉斯(Niall Douglas)

我一直在使用出色的C接口libclang(http://clang.llvm.org/doxygen/group__CINDEX.html编写C ++ AST解析器不幸的是,在C ++ 11范围内的枚举和老式的枚举之间似乎没有歧义:两者的游标类型为CXCursor_EnumDecl,并且类型为CXType_Enum Ie相同。

我曾尝试拜访孩子,看看他们的父母类型是否不同-遗憾的是没有。我试过询问底层类型,我都得到了一个整数。我检查了在Enum之后声明的所有项目,以查看是否可能出现老式的Enums绑定或typedef,再次没有明显区别。

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

尼尔·道格拉斯(Niall Douglas)

因此,这是一个解决方案,尽管它不是很好,但可能会帮助其他人。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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

枚举和枚举之间的区别

来自分类Dev

如何在引用int和作用域枚举之间进行static_cast?

来自分类Dev

如何使用libclang获取枚举元素的数值?

来自分类Dev

枚举器和函数作用域

来自分类Dev

使用libclang查找匿名枚举

来自分类Dev

开启作用域枚举

来自分类Dev

性能和内存使用方面的“静态const”,“#define”和“枚举”之间的区别

来自分类Dev

枚举和最终变量之间有什么区别?

来自分类Dev

枚举器,结构和类之间有什么区别?

来自分类Dev

模型说明中“枚举”和“输入”之间的区别

来自分类Dev

如何使用无作用域枚举器,就像其类型是其基础类型一样

来自分类Dev

如何在Rails中为多个枚举添加作用域

来自分类Dev

访问python枚举成员时如何检测和调用函数

来自分类Dev

在Swift中声明和使用位域枚举

来自分类Dev

在Swift中声明和使用位域枚举

来自分类Dev

如何使用动态枚举名称和枚举键名称查找枚举值?

来自分类Dev

和枚举列表之间的操作

来自分类Dev

将作用域枚举转换为int

来自分类Dev

静态枚举和静态结构之间的区别

来自分类Dev

警告C26812:枚举类型未作用域。优先于枚举类而不是枚举

来自分类Dev

如何使用枚举值?

来自分类Dev

如何使用枚举器

来自分类Dev

如何使用Mongoid枚举

来自分类Dev

如何使用枚举?

来自分类Dev

如何使用枚举标志?

来自分类Dev

Swift 检测碰撞和设置枚举

来自分类Dev

多重选择,枚举,命令对象和域类之间的Grails绑定

来自分类Dev

试图了解此C程序中静态作用域和动态作用域之间的区别

来自分类Dev

PostgreSQL枚举和Java枚举之间的休眠映射

Related 相关文章

热门标签

归档