首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(void (*)(void *))的涵义

(void (*)(void *))的涵义
EN

Stack Overflow用户
提问于 2015-05-07 08:35:20
回答 3查看 4.8K关注 0票数 5

您能解释一下(void (*)(void *))在以下表达式中的含义吗?

代码语言:javascript
复制
(void (*)(void *))pthread_mutex_unlock
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-07 08:43:03

外括号代表一个铸体。这些括号中的东西是要转换的类型。

在本例中,它是指向函数(*)的指针,接受void*参数,并返回void (即无)。

它在这里用于强制转换pthread_mutex_unlock,它具有签名

代码语言:javascript
复制
int pthread_mutex_unlock(pthread_mutex_t*);

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

代码语言:javascript
复制
void function(void*);

请注意,这样做的智慧在很大程度上取决于所针对的平台。用正确签名的另一个函数包装将更安全(即更可移植)。

代码语言:javascript
复制
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的等等)。而且,在阅读代码时,它们更容易被发现。

票数 5
EN

Stack Overflow用户

发布于 2015-05-07 08:39:04

它是一个“C样式”转换为类型指针到函数,使用一个void*参数而不返回任何东西(由于返回类型错配而具有未定义的行为).

请注意,pthread_mutex_unlock本身的类型是:

代码语言:javascript
复制
int pthread_mutex_unlock(pthread_mutex_t *mutex); 

它可能用于让一些知道如何调用期望void*的函数的代码实际对pthread_mutex_unlock进行回调,这将在大多数编译器上工作,因为int返回值通常只保存在调用者的寄存器中,因此忽略它不会影响堆栈布局或展开,但一些编译器可能会崩溃。

示例:

代码语言:javascript
复制
template <typename T>
class On_Destruction
{
  public:
    On_Destruction(void(*f)(T), T t)
      : f_(f), t_(t)
    { }

    ~On_Destruction() { f_(t_); }
  private:
    void (*f_)(void*);
    T t_;
};

...in some function...

    pthread_mutex_lock(my_mutex);
    On_Destruction<void*> guard((void(*)(void*))pthread_mutex_unlock,
                                (void*)&my_mutex);
    ...unlock when unwinding stack by return/break/throw etc...

有很多更好的方法来做这件事,没有未定义的行为(由于身体施放).例如使用std::mutexstd::lock_guard

票数 2
EN

Stack Overflow用户

发布于 2015-05-07 08:42:06

这句话不是“自给自足”。

它告诉您,指向函数pthread_mutex_unlock()的指针将转换为:

指向函数的指针,将指向任何对象的指针作为参数,而不返回任何内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30095846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档