[英]What does “void SomeFunction(int, void*)” mean?
我正在嘗試一些OpenCV,並且正在使用Canny邊緣檢測器Example的教程。
在本教程中,有一個這樣聲明的函數:
void CannyThreshold(int, void*)
然后從main內部這樣調用;
CannyThreshold(0, 0);
我不理解聲明的(int,void *)部分的目的,因為CannyThreshold函數中沒有使用任何這些參數。
為什么不只是這樣聲明呢?
void CannyThreshold();
注意示例中的這一行:
createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
在這里, CannyThreshold
作為回調參數傳遞給createTrackbar
。 createTrackbar
的簽名要求回調函數接受這兩個參數,即使CannyThreshold
沒有用到它們也是如此。
如果將函數聲明為
void CannyThreshold();
那和
void CannyThreshold(void);
換句話說,它是一個不帶參數的函數。
如果要讓函數接受參數,但不要使用這些參數,則仍必須聲明參數的類型。
據推測這是因為此函數是一個回調 ,因此其簽名是通過使用的任何API(此處為OpenCV)來強制執行的。
回調是在事件發生時將該函數注冊到事件系統中以供稍后調用時給該函數賦予的名稱。 注冊回調的函數稱為函子 ,它將另一個函數作為參數,並對其進行處理。 范例:
using callback_t = void(*)(int);
void register_callback(callback_t cb);
如果要定義一個要由register_callback
調用(返回)的回調,則即使不需要整數,它也必須是一個帶有int
並返回void
的函數。 因此,以下定義是可能的:
void my_callback(int) { std::cout << "done\n"; }
register_callback(my_callback);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.