2012-03-07 3 views
9

함수에 전달 된 인수를 가져 오려고합니다. 예를 들어 전화가있는 경우Clang AST를 사용하여 함수의 인수를 인쇄

printf ("% d % d", i, j);

출력 I I 기능을 얻을 수이다

가 VisitCallExpr으로 전화
J() RecursiveASTVisitor에

퍼센트 D % d에
이어야한다. 또한 인수의 수와 인수 유형을 얻을 수 있습니다. 그러나 나는 논쟁을하는 법을 모른다.

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E) 
{ 
    for(int i=0, j=E->getNumArgs(); i<j; i++) 
    { 
     llvm::errs() << "argType: " << E->getArg(i)->getType().getAsString() << "\n"; 
    } 
    return true; 
} 

출력 :

argType : 문자 *
argType :
argType를 int로 :

이 인수를 받고 도와주세요 int로.

답변

9

당신은 E-> getArg (i) -> getType()을 호출하고 있는데, 이것은 인수 유형입니다. E-> getArg (i)를 사용하여 인수의 값을 나타내는 Expr *을 얻습니다. 그런 다음 printPretty(...) 메서드를 사용하여 문자열 값이 필요한 경우이를 문자열로 출력하십시오.

+0

안녕 마틴을, 당신의 대답은 매우 도움이 마틴이었다. 나는 printPretty (...) 함수에 대해 몰랐다. 자, 인수를 인쇄 할 수 있습니다. 고맙습니다. –

11

귀하의 답변은 매우 도움이되는 마틴입니다. 나는 printPretty (...) 함수에 대해 몰랐다. 자, 인수를 인쇄 할 수 있습니다. 다음은 인수를 인쇄하는 코드입니다.

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E) 
{ 
    clang::LangOptions LangOpts; 
    LangOpts.CPlusPlus = true; 
    clang::PrintingPolicy Policy(LangOpts); 

    for(int i=0, j=E->getNumArgs(); i<j; i++) 
    { 
     std::string TypeS; 
     llvm::raw_string_ostream s(TypeS); 
     E->getArg(i)->printPretty(s, 0, Policy); 
     llvm::errs() << "arg: " << s.str() << "\n"; 
    } 
    return true; 
} 

는 출력은 다음과 같습니다

"%d%d" 
i 
j