[英]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.