数组作为带参数的函数?

Array as function with arguments?

我正在努力学习 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 的常量数组?
这是某种包含函数 ram 和日期的包装函数吗?一些声明数组的替代方法?

functab 是一个函数指针数组(准确地说是 const 函数指针数组),returns const char* 并且不接受任何参数。

稍后,

 ... = { ram, date };

是一个用大括号括起来的初始化器列表,用作数组的初始化器。

这是在 C 语言中定义函数指针数组的方法。因此,您可以通过 (* functab[1]).

调用此数组,而不是将函数作为 ram() 来调用

下面的讨论有很好的函数指针数组的例子: How can I use an array of function pointers?

简答:这里functab是一个函数指针数组,数组是用指向函数ramdate的指针初始化的。这也解释了可能来自 "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 的类型时才有效,这里是 ftype_t。类型定义应采用以下形式:

typedef int (*ftype_t)(const char*);

在英语中,这意味着 ftype_t 被定义为一种函数类型,它以 const char* 作为其唯一参数并且 returns int.

如果您不想 typedef 只是为了这个,您可以通过以下方式实现同​​样的目的:

int (*funcptr)(const char*) = &do_stuff; 

这行得通,但它的语法令人困惑。如果你试图做一些事情,比如构建一个函数指针数组,它也会变得非常丑陋,这正是你的代码所做的。

下面显示的是等效代码,更容易理解:

typedef static const char*(*myfn_t)(void);

const myfn_t functab[] = { &ram, &date };

(&(地址)通常是可选的,但建议使用。)

在 C:

中需要从里到外读取复杂的变量声明
  • functab是变量的标识,所以我们从这里开始阅读...

  • functab[]是一个数组...

  • *const functab[] 常量指针...

  • (*const functab[])(...) 函数...

  • (*const functab[])(void) 不带参数...

  • const char*(*const functab[])(void) 但 return 一个 const char*.

static 的含义取决于它是在函数外部还是内部。如果它在外部,static 意味着 functab 是在文件范围内声明的(即,仅在单个 .c 文件内可见的全局变量)。如果它在函数内部,则意味着 functab 是一个全局变量,仅在该函数内部可见。

= { ram, date } 用两个成员初始化数组。 ramdate 都应该是声明为 const char* ram(void).

的函数

此声明的效果是,以下函数调用是等效的:

const char* result = ram();
const char* result = functab[0]();