我正在將Perl嵌入到我們的應用程序中。我們已經安裝了很多在Perl中調用的C++函數。其中之一是日誌記錄功能。我想將調用此函數的Perl文件的文件名和行號添加到日誌消息中。
我知道在Perl方面我可以使用「caller()」函數來獲取這些信息,但是這個函數已經在數百個位置使用過了,所以我寧願修改C++端,這個信息是否傳遞給了C++ XSUB的功能,如果是的話,我將如何得到它?從C++中確定perl文件的行號和文件名
謝謝。
我正在將Perl嵌入到我們的應用程序中。我們已經安裝了很多在Perl中調用的C++函數。其中之一是日誌記錄功能。我想將調用此函數的Perl文件的文件名和行號添加到日誌消息中。
我知道在Perl方面我可以使用「caller()」函數來獲取這些信息,但是這個函數已經在數百個位置使用過了,所以我寧願修改C++端,這個信息是否傳遞給了C++ XSUB的功能,如果是的話,我將如何得到它?從C++中確定perl文件的行號和文件名
謝謝。
這應該工作:
char *file;
I32 line;
file = OutCopFILE(PL_curcop);
line = CopLINE(PL_curcop);
控制OPS(警察)是兩個OPS的一個OP_NEXTSTATE和op_DBSTATE, 是(嚴格意義上)是分開的語句。 他們掌握重要的詞彙狀態和錯誤報告信息。 在運行時,PL_curcop被設置爲指向最近執行的警察, ,因此可用於確定我們的當前狀態。
- cop.h
難道你不能從XS調用perl builtins嗎?我承認我不知道。
如果沒有,你總是可以做這樣的事情:
sub logger { _real_logger(caller, @_) }
假設logger
是你的函數叫什麼(你命名你的C++ XS功能_real_logger
你也可以做到這一點,據推測,如果。你需要隱藏自己在調用樹:
sub logger {
unshift @_, caller;
goto &_real_logger;
}
這當然是後藤的AUTOLOAD
使用的正常形態
這些會增加開銷,當然,但對於日誌記錄功能可能不是什麼大問題。
的功能都安裝在一個被稱爲從C「走出去」 ++命名空間,它通過了::到處調試參考,我不知道我是否可以在安裝一個perl功能儘管相同的命名空間。開銷不大,只是爲了調試。 – Toblakai