2012-03-07 40 views
9

Tôi muốn lấy các đối số được truyền cho một hàm. ví dụ: nếu tôi có cuộc gọiĐối số in của một hàm sử dụng Clang AST

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

sản lượng nên được

% d% d
i
j

tôi có thể để có được chức năng cuộc gọi sử dụng VisitCallExpr() trong RecursiveASTVisitor. Cũng có thể nhận được số lượng các đối số và các loại đối số. Nhưng tôi không biết làm thế nào để có được các đối số.

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; 
} 

Output:

argType: char *
argType: int
argType: int

Xin hãy giúp tôi nhận các đối số.

Trả lời

9

Bạn đang gọi E-> getArg (i) -> getType() - nhưng đó là loại đối số. Sử dụng E-> getArg (i) để lấy Expr * đại diện cho giá trị của đối số. Sau đó, sử dụng phương pháp printPretty(...) để in đẹp nó thành chuỗi, nếu bạn cần giá trị chuỗi.

+0

Hi martins, câu trả lời của bạn là martins rất hữu ích. Tôi không biết về hàm printPretty (...). Bây giờ, tôi có thể in các đối số. Cảm ơn bạn. –

11

câu trả lời của bạn là các siêu thị rất hữu ích. Tôi không biết về hàm printPretty (...). Bây giờ, tôi có thể in các đối số. dưới đây là mã của tôi để in các đối số.

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; 
} 

và đầu ra trông như thế này:

"%d%d" 
i 
j 
Các vấn đề liên quan