我正在尝试学习c,所以我尝试阅读一些源代码 但我不知道这可能意味着什么:
static const char*(*const functab[])(void)={
ram,date
};
第一部分static const char*
很好,因为它似乎是一个函数(有void
类型的参数),static
应该意味着它只在这个文件中可见而const char*
应该意味着价值不能改变,但地址可以改变
但是在这种情况下,在函数名后面的最后一部分之后没有意义,因为它是
static const char * date(void);
static const char * ram(void);
而不是函数名称有(*const functab[])
,一个名为functab的const数组包含地址?
这是包含函数ram和date的某种包装函数吗?一些声明数组的替代方法?
答案 0 :(得分:4)
functab
是一个函数指针数组(确切地说是const
函数指针的数组),它返回const char*
并且不接受任何参数。
后来,
... = { ram, date };
是一个括号括起的初始化列表,用作数组的初始化器。
答案 1 :(得分:3)
这是在C中定义函数指针数组的方法。因此,不是将函数调用为ram(),而是使用此数组,可以通过(* functab[1])
调用它。
下面讨论了函数指针数组的好例子: How can I use an array of function pointers?
答案 2 :(得分:2)
简短回答:这里functab
是一个函数指针数组,数组初始化为指向函数ram
和date
的指针。这也解释了可能来自" FUNCtion TABle"的名称functab。
答案很长:在C语言中,您可以获得指向函数的指针并将其保存到变量中。以这种方式使用的变量称为函数指针。
例如,下面的funcptr
变量将包含do_stuff
的入口点地址:
int do_stuff(const char* x) { ...do stuff.. }
...
ftype_t funcptr = &do_stuff;
...
(*funcptr)("now"); // calls do_stuff()
仅当您已在此处定义funcptr
的{{1}}类型时,此功能才有效。类型定义应采用以下形式:
ftype_t
在英语中,这意味着typedef int (*ftype_t)(const char*);
被定义为一种函数,它将ftype_t
作为唯一参数并返回const char*
。
如果你不想int
只为了这个,你可以通过以下方式实现同样的目标:
typedef
这样可行,但其语法令人困惑。如果您尝试执行诸如构建函数指针数组之类的操作,这也会非常难看。这正是您的代码所做的。
下面显示的是等效代码,更容易理解:
int (*funcptr)(const char*) = &do_stuff;
(&(地址)通常是可选的,但建议使用。)
答案 3 :(得分:1)
需要在C:
中读出复杂的变量声明 functab
是变量的标识符,所以我们开始在这里阅读...
functab[]
这是一个数组...
*const functab[]
常量指针...
(*const functab[])(...)
到函数...
(*const functab[])(void)
不参与......
const char*(*const functab[])(void)
但返回const char*
。
static
的含义取决于它是在函数的外部还是内部。如果它在外面,static
表示functab
声明了文件范围(即只在单个.c
文件中可见的全局变量)。如果它在函数内部,则意味着functab
是一个仅在该函数内可见的全局变量。
= { ram, date }
使用两个成员初始化数组。 ram
和date
都应该是声明为const char* ram(void)
的函数。
此声明的效果是,以下函数调用是等效的:
const char* result = ram();
const char* result = functab[0]();