gpt4 book ai didi

c++ - (void (*)(void *))的含义

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:34 24 4
gpt4 key购买 nike

你能解释一下下面表达式中(void (*)(void *))的含义吗:

(void (*)(void *))pthread_mutex_unlock

最佳答案

外括号代表 Actor 阵容。这些括号内的内容是要转换为的类型。

在本例中,它是一个指向函数的指针 (*) , 采取 void*参数,并返回 void (即什么都没有)。

这里用来投pthread_mutex_unlock , 有签名

int pthread_mutex_unlock(pthread_mutex_t*);

这样它就可以用于(例如,作为回调)需要类型函数的东西

void function(void*);

请注意,这样做是否明智在很大程度上取决于所针对的平台。用另一个具有正确签名的函数包装函数会更安全(即更便携)

void pthread_mutex_unlock_wrapper(void *mutex)
{
pthread_mutex_unlock((pthread_mutex_t*)mutex);
}

这对 pthread_mutex_unlock 的参数类型执行转换并丢弃返回类型。这避免了由于调用者和被调用者对参数和返回值的空间要求有不同的理解而导致堆栈损坏的可能性(尽管在实践中这可能很少成为忽略返回值的问题,但最好还是安全).

尾注:

最后一点,由于您将问题标记为 C++,因此您可以替换 (pthread_mutex_t*)mutex使用 static_cast<pthread_mutex_t*>(mutex) 在包装函数中进行转换,它执行等效转换,但更容易阅读和理解为强制转换。如果你真的在使用 C++,你应该更喜欢这些“C++ 风格”的强制转换,因为它们有明确定义的语义(即你可以限制 static_cast ,你可以限制 dynamic_cast 等)并且它们阅读代码时更容易发现。

关于c++ - (void (*)(void *))的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com