10

関数に渡される引数を取得したい。たとえば、電話があったら

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

出力は次のようになります

%d%d
i
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:int
argType:int

議論を得るのを手伝ってください。

4

2 に答える 2

13

あなたの答えは非常に有用なマーティンでした。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
于 2012-03-09T18:36:13.767 に答える
10

E-> getArg(i)-> getType()を呼び出していますが、これは引数のタイプです。E-> getArg(i)を使用して、引数の値を表すExpr*を取得します。次に、文字列値が必要な場合は、printPretty(...)メソッドを使用して文字列にきれいに出力します。

于 2012-03-07T20:58:33.550 に答える