如何使用 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 愉快!
我希望能够从复杂的 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 愉快!