我正在分析一些多线程代码。在一个初始化函数中,有一段代码是这样的:
for(i=0;i<MAX_STREAMS;i++){
cmdStreamTaskPtr[i] = NULL;
}
我理解该语法,但我的问题出在 cmdStreamTaskPtr
的声明中。它按以下方式定义,其中 cmdData_t
是一个 typedef 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
指向不带参数并返回 cmdData_t *
的函数指针的 typedef .然后可以将数组定义更改为:
static fp cmdStreamTaskPtr[MAX_STREAMS];
所以现在应该更清楚了cmdStreamTaskPtr
是 fp
的数组, 其中 fp
是之前定义的函数指针。
关于C - 这个函数指针声明是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50805713/