#c #clang #libtooling
#c #clang #libtooling
Вопрос:
Как получить информацию о параметрах в виде строки из класса FunctionDecl в clang. Я пытаюсь, но меня смущает так много наследований. Также компилятор сообщает, что getReturnType() не является членом FunctionDecl, но документация doxygen говорит об обратном. Пожалуйста, помогите. http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
using namespace std;
using namespace clang;
using namespace clang::driver;
using namespace clang::tooling;
using namespace llvm;
.......
class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor>
{
......
virtual bool VisitFunctionDecl(FunctionDecl *func)
{
numFunctions ;
string funcName = func->getNameInfo().getName().getAsString();
string retName = func->getReturnType().getAsString();
...
return true;
}
}
Ошибки:-
‘class clang::FunctionDecl’ не имеет члена с именем ‘getReturnType’
Комментарии:
1. Покажите свой код и ошибки, которые вы получаете.
2. вопрос отредактирован с помощью кода
3. Предполагая, что документация верна: clang.llvm.org/doxygen/… Откуда эта ошибка? Вы уверены, что это из этой строки? Можете ли вы попытаться полностью квалифицировать его с помощью clang::FunctionDecl?
4. квалификация не помогла, и ошибка только в этой строке
5. Это странно, пожалуйста, перейдите и проверьте Decl.h для getReturnType() . Если у вас ее нет, возможно, вам придется обновить источники clang
Ответ №1:
В зависимости от того, требуется ли вам определенное или неквалифицированное имя, вы можете указать возвращаемый тип и имена параметров следующим образом
std::string retType = F->getReturnType().getAsString();
std::string arg0;
if(F->getNumParams() > 0)
arg0 = F->parameters()[0]->getQualifiedNameAsString();
Проверьте предоставленный метод getAsString().
Редактировать: после ваших комментариев я понял, что у вас нет последнего исходного кода Clang. Пожалуйста, проверьте это перед повторной попыткой. Удачи!
Комментарии:
1. Тогда почему говорится, что getReturnType() не является членом FunctionDecl .
2. Либо эта ошибка исходит откуда-то еще, либо вы получаете неправильное зеркало репозитория FunctionDecl — GitHub ( github.com/llvm-mirror/clang/blob/master/include/clang/AST /… )
Ответ №2:
попробуйте это,
getResultType()
вместо
getReturnType()
llvm 3.4 не имеет члена getReturnType()
, кроме идентичной функции, имя которой getResultType()
существует.
Ответ №3:
Чтобы получить весь список параметров динамически, приведенный ниже код поможет.
string retName = func->getReturnType().getAsString();
for(int i=0; i<func->getNumParams(); i )
{
std::cout << " " << func->parameters()[i]->getQualifiedNameAsString();
}
...
Ответ №4:
Вот рабочая функция для печати всей информации о FunctionDecl.Протестировано на Windows / LLVM6.0.0
void printFunctionDecl(FunctionDecl* f)
{
std::cout << "FunctionDecl@:"<<f<<":"
<< f->getReturnType().getAsString()<<" "
<< f->getQualifiedNameAsString()
<<"(";
for (int i = 0; i < f->getNumParams(); i )
{
if (i > 0) std::cout << ",";
std::cout
<< QualType::getAsString(f->parameters()[i]->getType().split()
, PrintingPolicy{ {} })<<" "
<< f->parameters()[i]->getQualifiedNameAsString();
}
std::cout << ")"
<<" Definition@"<<f->getDefinition()
<<"n";
}