2012-03-07 22 views
9

我想獲取傳遞給函數的參數。例如,如果我有電話使用Clang打印參數的函數AST

printf(「%d%d」,i,j);

輸出應該是

%d%d

Ĵ

我能夠得到函數調用使用VisitCallExpr()在RecursiveASTVisitor。也能夠獲得參數的數量和參數類型。但我不知道如何得到論據。

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:整數

請幫我得到的參數。

回答

9

您正在調用E-> getArg(i) - > getType() - 但這是參數的類型。使用E-> getArg(i)來獲取表示參數值的Expr *。然後使用printPretty(...)方法將它打印爲字符串,如果需要字符串值。

+0

嗨馬丁斯,你的答案是非常有益的馬丁斯。我不知道printPretty(...)函數。現在,我可以打印參數。謝謝。 – 2012-03-09 18:39:54

11

你的回答非常有幫助martins。我不知道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