2012-03-07 9 views
9

関数に渡された引数を取得したいと思います。たとえば、私に電話がある場合Clang ASTを使用した関数の引数を出力

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

出力は

% dの%dの

J

私はRecursiveASTVisitorでVisitCallExprを(使用して通話を)機能するように取得することができていなければなりません。また、引数の数と引数の型を取得することができます。しかし、私はどのように議論を得るか分からない。

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ます。char *
argType:
argTypeをint型:

は引数を取得し、私を助けてくださいint型。

答えて

9

あなたはE-> getArg(i) - > getType()を呼び出していますが、これは引数の型です。引数の値を表すExpr *を取得するには、E-> getArg(i)を使用します。文字列値が必要な場合は、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 
関連する問題