2011-12-12 48 views
4

我正在將Perl嵌入到我們的應用程序中。我們已經安裝了很多在Perl中調用的C++函數。其中之一是日誌記錄功能。我想將調用此函數的Perl文件的文件名和行號添加到日誌消息中。
我知道在Perl方面我可以使用「caller()」函數來獲取這些信息,但是這個函數已經在數百個位置使用過了,所以我寧願修改C++端,這個信息是否傳遞給了C++ XSUB的功能,如果是的話,我將如何得到它?從C++中確定perl文件的行號和文件名

謝謝。

回答

2

這應該工作:

char *file; 
I32 line; 

file = OutCopFILE(PL_curcop); 
line = CopLINE(PL_curcop); 

控制OPS(警察)是兩個OPS的一個OP_NEXTSTATE和op_DBSTATE, 是(嚴格意義上)是分開的語句。 他們掌握重要的詞彙狀態和錯誤報告信息。 在運行時,PL_curcop被設置爲指向最近執行的警察, ,因此可用於確定我們的當前狀態。

- cop.h

1

難道你不能從XS調用perl builtins嗎?我承認我不知道。

如果沒有,你總是可以做這樣的事情:

sub logger { _real_logger(caller, @_) } 

假設logger是你的函數叫什麼(你命名你的C++ XS功能_real_logger你也可以做到這一點,據推測,如果。你需要隱藏自己在調用樹:

sub logger { 
    unshift @_, caller; 
    goto &_real_logger; 
} 

這當然是後藤的AUTOLOAD使用的正常形態

這些會增加開銷,當然,但對於日誌記錄功能可能不是什麼大問題。

+0

的功能都安裝在一個被稱爲從C「走出去」 ++命名空間,它通過了::到處調試參考,我不知道我是否可以在安裝一個perl功能儘管相同的命名空間。開銷不大,只是爲了調試。 – Toblakai