我正在分析一些多线程代码.在初始化函数中,有一段代码如下:
for(i=0;i<MAX_STREAMS;i++){
cmdStreamTaskPtr[i] = NULL;
}
Run Code Online (Sandbox Code Playgroud)
我理解语法,但我的问题在于声明cmdStreamTaskPtr.它按以下方式定义,其中cmdData_ta typedef struct和MAX_STREAMS是5.
static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void) = {[0 ... MAX_STREAMS-1] = NULL};
Run Code Online (Sandbox Code Playgroud)
我不知道这条线是什么意思.它是一个具有默认值的变量吗?
dbu*_*ush 25
cmdStreamTaskPtr 是一个数组:
cmdStreamTaskPtr[MAX_STREAMS]
Run Code Online (Sandbox Code Playgroud)
指针:
*cmdStreamTaskPtr[MAX_STREAMS]
Run Code Online (Sandbox Code Playgroud)
对于不接受任何参数的函数:
(*cmdStreamTaskPtr[MAX_STREAMS])(void)
Run Code Online (Sandbox Code Playgroud)
并返回cmdData_t *:
cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void)
Run Code Online (Sandbox Code Playgroud)
并且是static:
static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void)
Run Code Online (Sandbox Code Playgroud)
然后NULL为所有数组成员初始化该数组:
static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void) = {[0 ... MAX_STREAMS-1] = NULL};
Run Code Online (Sandbox Code Playgroud)
请注意,初始化语法[0 ... MAX_STREAMS-1]是不是标准C而是由GCC支持的扩展.在这种情况下它也是多余的,因为数组被声明为static,这意味着它具有静态存储持续时间,因此NULL如果没有显式初始化,则它的元素被隐式初始化.
使用a可以更清楚地使用函数指针typedef.在这种情况下,我们可以创建以下typedef:
typedef cmdData_t *(*fp)(void);
Run Code Online (Sandbox Code Playgroud)
这使得fp一个指向函数的指针的typedef不带参数并返回一个cmdData_t *.然后可以将数组定义更改为:
static fp cmdStreamTaskPtr[MAX_STREAMS];
Run Code Online (Sandbox Code Playgroud)
所以现在应该更清楚的cmdStreamTaskPtr是一个数组fp,其中a fp是先前定义的函数指针.