我想打印CIL結構,例如根據CIL API,它具有如下功能:例如, Cil.d_instr
,我可以使用它來打印到Errormsg,如Errormsg.log "Instruction: %a\n" d_instr i;
我想將它存儲在一個變量中。我試過了:在CIL(OCaml)中打印
let i_str = Printf.sprintf "%a" Pretty.sprint (d_instr i) in ...
但是,這會導致類型不匹配編譯錯誤。 任何人都可以幫助我嗎?謝謝!
我想打印CIL結構,例如根據CIL API,它具有如下功能:例如, Cil.d_instr
,我可以使用它來打印到Errormsg,如Errormsg.log "Instruction: %a\n" d_instr i;
我想將它存儲在一個變量中。我試過了:在CIL(OCaml)中打印
let i_str = Printf.sprintf "%a" Pretty.sprint (d_instr i) in ...
但是,這會導致類型不匹配編譯錯誤。 任何人都可以幫助我嗎?謝謝!
功能Cil.d_instr
的原型如下:
val d_instr : unit -> instr -> Pretty.doc
因此,爲了獲得Pretty.doc
類型的值,你需要的指令之前申請unit
類型的值:d_instr() i
。
然後,要將Pretty.doc
轉換爲string
,則需要使用Pretty.sprint : width:int -> doc -> string
。請注意,您需要提供最大寬度(但如果您願意,您可以使用非常大的寬度)。最後,結合兩部分,你會得到:
let i_str = Pretty.sprint max_int (Cil.d_instr() i)
我建議你仔細閱讀Pretty
的文檔:http://kerneis.github.io/cil/doc/html/cil/api/Pretty.html。它會特別說明,儘可能長時間使用Pretty.doc
類型的值,將值與(++)
連接起來,並且僅在最後才轉換爲字符串(或發送到標準輸出)會更有效。
最後,但是這在我看來是不必要的複雜,這裏是如何組成的,如果你真的想用Printf.sprintf
:
let ds_instr() i = Pretty.sprint max_int (Cil.d_instr() i) in
let i_str = Printf.sprintf "%a" ds_instr i in ...