Как расширить сложный typedef до его базовой встроенной формы с помощью clang? - PullRequest
0 голосов
/ 13 июня 2019

Я хочу иметь возможность получить оригинальный тип из сложного typedef. Я использую Clang версии 7.1.0

Посмотрите на код ниже

typedef unsigned int uint32;
typedef uint32 * p_uint32;

p_uint32 p_uint_var;

Я могу извлечь тип p_uint_var, используя VisitVarDecl, вот так

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

    return true;
}

вывод, который я получаю, это

p_uint32 p_uint_var

что я хотел бы получить, это

без знака int * p_uint_var

Как мне этого добиться?

1 Ответ

0 голосов
/ 13 июня 2019

То, что вы ищете, это канонический тип . В этом вопросе вы можете прочитать о каноническом типе в Clang и различных ситуациях, связанных с ним.

Превращая его в реальный код, мы получаем это:

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

Этот код создает следующий вывод для вашего фрагмента кода:

unsigned int * p_uint_var

ПРИМЕЧАНИЕ : не делать функции посещений виртуальными. Все классы посетителей Clang: CRTP .

Надеюсь, эта информация полезна. Счастливого взлома с Clang!

...