我正在分析一些多线程代码。在初始化函数中,有一段代码如下:
for(i=0;i<MAX_STREAMS;i++){
cmdStreamTaskPtr[i] = NULL;
}
我了解该语法,但是我的问题出在的声明中cmdStreamTaskPtr
。它是通过以下方式定义的,其中cmdData_t
atypedef struct
和MAX_STREAMS
5。
static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void) = {[0 ... MAX_STREAMS-1] = NULL};
我不知道这行是什么意思。它是具有默认值的变量吗?
cmdStreamTaskPtr
是一个数组:
cmdStreamTaskPtr[MAX_STREAMS]
指针:
*cmdStreamTaskPtr[MAX_STREAMS]
要不接受任何参数的函数:
(*cmdStreamTaskPtr[MAX_STREAMS])(void)
并返回一个cmdData_t *
:
cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void)
并且是static
:
static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void)
然后使用NULL
所有数组成员初始化该数组:
static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void) = {[0 ... MAX_STREAMS-1] = NULL};
请注意,初始化语法[0 ... MAX_STREAMS-1]
是不是标准C而是由GCC支持的扩展。在这种情况下,它也是多余的,因为该数组被声明为static
,这意味着它具有静态存储持续时间,因此,NULL
如果未显式初始化其元素,则将其隐式初始化为。
使用可以使函数指针的使用更加清晰typedef
。在这种情况下,我们可以创建以下typedef:
typedef cmdData_t *(*fp)(void);
这fp
将为指向不带任何参数并返回的函数的指针提供一个typedef cmdData_t *
。然后可以将数组定义更改为:
static fp cmdStreamTaskPtr[MAX_STREAMS];
因此,现在应该更加清楚的cmdStreamTaskPtr
是的数组fp
,其中anfp
是先前定义的函数指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句