C - 这个函数指针声明是什么意思?

JCM*_*uel 9 c arrays

我正在分析一些多线程代码.在初始化函数中,有一段代码如下:

for(i=0;i<MAX_STREAMS;i++){
    cmdStreamTaskPtr[i] = NULL;
}
Run Code Online (Sandbox Code Playgroud)

我理解语法,但我的问题在于声明cmdStreamTaskPtr.它按以下方式定义,其中cmdData_ta typedef structMAX_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是先前定义的函数指针.

  • 请注意,初始化程序是100%冗余.变量是`static`,因此默认情况下它将被初始化为零. (7认同)