2011-07-12 1 views
11

Ho bisogno di stampare il tipo di un parametro in un file sorgente C++ usando l'API clang.Stampa il tipo di parametro (ParmVarDecl) con clang API

Se si dispone di una rappresentazione di parametro in clang (ParmVarDecl* param), è possibile stampare il nome del parametro utilizzando param->getNameAsString(). Avrei bisogno di un metodo param->getTypeAsString(), ma non esiste un tale metodo. Quindi c'è un altro modo per fare questo compito?

risposta

22

avuto la risposta alla mia domanda nel IRC LLVM:

C'è un metodo std::string clang::QualType::getAsString(SplitQualType split)

Quindi questo funziona per me:

ParmVarDecl* param = *someParameter; 
cout << QualType::getAsString(param->getType().split()) << endl; 
+0

Probabilmente mi hai appena salvato una settimana –

+0

Mi hai sicuramente salvato tutta la notte. –

-2

È possibile utilizzare typeid per ottenere il nome di qualsiasi tipo. Sebbene varierà dal compilatore al compilatore e potrebbe non essere un bel nome.

#include <iostream> 
#include <typeinfo> 

struct MyStruct { }; 

int main() 
{ 
    std::cout << typeid(MyStruct).name() << std::endl; 
} 

Se avete bisogno di fare questo per un sacco di classi, si potrebbe fare la parte chiamata di una classe base, quindi ogni classe che ha bisogno della funzionalità può solo ereditare da essa.

#include <iostream> 
#include <typeinfo> 

class NamedClass 
{ 
    public: 
    virtual ~NamedClass() { } 

    std::string getNameAsString() 
    { 
     return typeid(*this).name(); 
    } 
}; 

class MyStruct : public NamedClass 
{ 
}; 

int main() 
{ 
    MyStruct ms; 
    std::cout << ms.getNameAsString() << std::endl; 
} 
+5

Come questo è collegato al domanda posta? Il q. era sull'API clang, voleva farlo sul clang AST. –

+0

Come Anton ha scritto, voglio farlo con l'API clang, in modo che quando elaboro un file sorgente, posso stampare le funzioni e i loro tipi di parametri. Ma proverò la tua risposta, forse potrò usarla. –