繁体   English   中英

使用宏强制转换pthread的start_routine参数

[英]Casting pthread's start_routine argument with a macro

我正在尝试了解我收到的一些代码。 它的工作方式与pthread_create相似:向它传递一个指向函数start_routine的指针,该函数将指向void arg的指针作为单个参数,并传递参数指针本身,然后pthread_create调用您的函数。

通常,如果start_routine实际上需要一个参数,则不需要void * ,而应将arg转换为指向某个结构的指针。 过去,我已经将start_routine编写为:

void *my_start_routine(void *arg)
{
    struct my_struct *p = arg;
    // use p many times
}

但是,我刚刚收到的代码中,作者每次使用p都会设置一个宏来进行强制转换:

void *my_start_routine(void *arg)
{
#define p ((struct my_struct *) arg)
    // use p many times

#undef p
}

我很难理解为什么要这么做。 但是我认为它是有意的,因为它看起来比第一种方法更困难且不那么明显,并且作者在整个代码中都使用了类似的习惯用法。 是否出于某种原因(无论出于性能还是其他原因)更喜欢此处的宏?

你的习惯是可取的。 在我看来,其他人使用该宏是可憎的,原因如下:

  • p不是左值
  • 改变arg会影响p并非显而易见。
  • 调试器不会知道p是什么。
  • ...

我可能看到的唯一可能的区别是,不会在堆栈上为p分配空间,但这是一个相当可疑的优化,因为它在函数开始时只执行了一次,并且很可能会被编译器优化任何方式。

如今,我倾向于仅将预处理器用于非常简单的替换,因为宏可以更好地完成,因为内联函数(或编译器进行自己的优化)和分组常量(例如错误代码)更好地作为枚举。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM