我正在用C 做一個專案,但在應用的某個階段,它失敗了,產生了一個核心轉儲。該應用程式使用了幾個類,在這里我只關注其中一個類,我稱之為 A,并被實體化為物件 a。這個類有大量的成員函式,目前只有少數幾個被使用,但其中一個會生成一個日志,以產生用于除錯的診斷程式。我想用它來找出應用程式失敗的原因。
。該專案是將呼叫各種成員函式的代碼放在一起,盡管我可以訪問源代碼和一些有限的檔案,但所有的代碼都不能改變,所有的改變都在使用類和呼叫成員函式的代碼中。有問題的成員函式是:
void enable_log (log_callback回呼。void * user_data = nullptr)
其中第1個引數callback包含訊息,第2個引數是可選的。現在,它可以被設定為nullptr,所以將被呼叫為:
a.enable_log(callback, nullptr)。
從這個檔案中,我們根本不清楚callback到底是什么。然而,在看源代碼的時候,這是:
using log_callback = void (*)(const std: :string& message, void* user_data)。)
在頭檔案中,log_callback是const std::string& 的別名,如果我理解正確的話。
我已經在一個使用 Visual Studio 2019 的平臺上建立了虛擬類,其中有一些測驗成員函式,以模擬在遠程 Linux 服務器上呼叫成員函式,但我無法找到利用上述成員函式的方法。我將測驗成員函式添加到虛擬類中,如下所示:
void enable_log(const std: :string& callback, void* user_data = nullptr){
callback = "ABCD"。
}
這應該是為了生成一個測驗字串,并將其回傳,這樣在實際應用中,這個字串將有診斷資訊,并被寫入一個檔案。然而,"="是個錯誤。
我們的想法是,在主函式中會宣告一個空字串,然后 enable_log() 應該填充這個字串,這個字串可以被列印出來。
我花了一些時間查看各種資源,包括 Stackoverflow,但我無法找到一種方法來回傳一個帶有可列印出的資訊的字串。我需要一個簡單的方法來模擬這一點,正如我上面所說的,我不能改變真實成員函式的源代碼,所以模擬的成員函式必須以同樣的方式產生一個字串。這是如何做到的?希望能得到一些建議。
uj5u.com熱心網友回復:
回呼,用簡單的話來說,就是一些以后會在某個時間點被呼叫的函式。例如:
void callback_fn(int a);
using callback_t = (void)(*)(int a)。
void some_func(callback_t)。
你可以像這樣使用some_func():
some_func(callback_fn)。
完整的例子在這里。https://godbolt.org/z/ET3GhfYrv
對于你的用例,回呼的引數略有不同。下面是如何閱讀語法的:
using log_callback = // this just creates an alias for whatever is on the right hands side
void /// "可呼叫 "的回傳型別應該是void。
(*) //這告訴我們,它是一個函式指標。
(const std::string& message, void* user_data) //這些是可呼叫的引數。它是一個 "std::string "和一個 "void *"。
要使用這個,只需創建一個具有相同簽名的自由函式:
void callable(const std: :string &msg, void *userData = nullptr)
{
//msg是由函式發送的資料。以任何方式使用它。
//你想要的。
std::cout << msg << '
'。
}
//傳給enable_log。
enable_log(可呼叫)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/328125.html
標籤:
上一篇:java物件的比較
