2016-11-14 77 views
0

我想漂亮打印Clang聲明到string,以便打印聲明的C/C++代碼。我這樣做以下列方式:漂亮打印聲明在叮鐺聲字符串

//Generate string and string ostream. 
string stmt; 
raw_string_ostream stream(stmt); 

//Get statement from ASTMatcher and print to ostream. 
auto* statement = result.Nodes.getNodeAs<clang::Expr>(types[VAR_STMT]); 
statement->printPretty(stream, NULL, PrintingPolicy(LangOptions())); 

//Flush ostream buffer. 
stream.flush(); 
cout << statement << endl; 


此代碼編譯並運行正常。但是,當我運行以下代碼時,我得到statement對象的地址打印到string。例如,當我運行此代碼,我得到以下的輸出:

0x3ccd598 
0x3ccd5b0 
0x3ccd728 
0x3ccdc88 
0x3ccdd08 


是不是真的在Clang的文檔很多文檔中關於printPretty(...)的那麼什麼是正確的方式到打印一個statement的代碼爲字符串?

回答

0

一個解決方案,我發現試圖得到這個工作是從Clang developers post從2013年開始

相反的:

//Generate string and string ostream. 
string stmt; 
raw_string_ostream stream(stmt); 

//Get statement from ASTMatcher and print to ostream. 
auto* statement = result.Nodes.getNodeAs<clang::Expr>(types[VAR_STMT]); 
statement->printPretty(stream, NULL, PrintingPolicy(LangOptions())); 

//Flush ostream buffer. 
stream.flush(); 
cout << statement << endl; 

我的代碼是現在:

//Get the statement from the ASTMatcher 
auto *statement = result.Nodes.getNodeAs<clang::Expr>(types[VAR_STMT]); 

//Get the source range and manager. 
SourceRange range = statement->getSourceRange(); 
const SourceManager *SM = result.SourceManager; 

//Use LLVM's lexer to get source text. 
llvm::StringRef ref = Lexer::getSourceText(CharSourceRange::getCharRange(range), *SM, LangOptions()); 
cout << ref.str() << endl; 

這種方法似乎工作,雖然我不太確定任何潛在的缺點。

0

由於您的類似變量名稱,您似乎會迷惑自己。您有一個變量stmt,它的類型爲string,並且您有一個變量statement,(推測)是clang::Stmt *printPretty調用正在修改stream變量,該變量寫入stmt,而不是statement。然後你打印statement,指向clang類型的指針。所以很自然地,一個指針類型的cout調用寫入指針的地址。

改變你的cout行寫出stmt,你會得到你所期望的。