数组作为带参数的函数?
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
是一个函数指针数组,数组是用指向函数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
的类型时才有效,这里是 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 }
用两个成员初始化数组。 ram
和 date
都应该是声明为 const char* ram(void)
.
的函数
此声明的效果是,以下函数调用是等效的:
const char* result = ram();
const char* result = functab[0]();
我正在努力学习 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])
.
下面的讨论有很好的函数指针数组的例子: How can I use an array of function pointers?
简答:这里functab
是一个函数指针数组,数组是用指向函数ram
和date
的指针初始化的。这也解释了可能来自 "FUNCtion TABle".
长答案:在 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 }
用两个成员初始化数组。 ram
和 date
都应该是声明为 const char* ram(void)
.
此声明的效果是,以下函数调用是等效的:
const char* result = ram();
const char* result = functab[0]();