如何使用 clang 将复杂的 typedef 扩展为其基本内置形式?

How to expand a complex typedef to its basic built-in form using clang?

我希望能够从复杂的 typedef 中获取原始类型。 我正在使用 clang 版本 7.1.0

看下面的代码

typedef unsigned int uint32;
typedef uint32 * p_uint32;

p_uint32 p_uint_var;

我可以像这样使用VisitVarDecl提取p_uint_var的类型

virtual bool VisitVarDecl(VarDecl *var)
{
    if(var->hasGlobalStorage())
    {
        llvm::outs() << var->getType().getAsString() << " " << var->getName() << "\n";
    }

    return true;
}

我得到的输出是这样的

p_uint32 p_uint_var

我想收到的是这个

unsigned int * p_uint_var

我怎样才能做到这一点?

您要找的东西是规范类型。在 this question 中,您可以阅读 Clang 中的 规范类型 以及涉及它的不同情况。

将其转换为我们得到的实际代码:

bool VisitVarDecl(VarDecl *Var) {
  llvm::outs() << Var->getType().getCanonicalType().getAsString() << " "
               << Var->getName() << "\n";
  return true;
}

此代码为您的代码片段生成以下输出:

unsigned int * p_uint_var

注意: 不要让访问函数虚化。所有 Clang 访问者 类 都是 CRTP

希望这些信息有用。祝您使用 Clang 愉快!