函数指针声明和函数定义在一起

3

我在旧文件中看到了一些代码。

void (*const m_exec[N_EXECS])(void) =
   {
       #define PROCESS_DEF_TIMED(name) name,   // defines macro for use in proclist.h
       #define PROCESS_TIMED                   // define switch for section in proclist.h
       #include "proclist.h"
       #undef PROCESS_TIMED                    // undefine switch
       #undef PROCESS_DEF_TIMED                // undefines macro
   }; 

我无法理解这段代码的含义。这是一个声明和函数定义在一起的函数指针吗?但是,如果我尝试像下面这样声明类似的函数指针,就会出现编译错误。
void (*voidFptr)(void) =
{
    printf("Hello\n");
}

此处的#define是什么?我不确定它为什么在函数内部出现。

2
它从包含在 "proclist.h" 中的列表中填充函数指针数组。 - Eugene Sh.
运行文件通过预处理器并查看预处理输出。 - Some programmer dude
你看过头文件了吗?也许你还注意到原始语法与你的不同。在程序代码中,每个字符都很重要,甚至是注释和字符串字面值中的字符。 - too honest for this site
1个回答

7

This:

void (*const m_exec[N_EXECS])(void)

在C语言中,声明函数指针数组的方法是通过使用格式如下的语法:typedef const void *(*proc)(void); proc proclist[N_EXECS] = { /* ... */ };。许多人都觉得这种方式难以理解。它声明了一个长度为N_EXECS的函数指针数组,其中每个元素都是一个不带参数且返回指向const-void的指针的函数。

花括号内的内容是数组初始化器;可能proclist.h文件中包含了很多函数指针声明,这里实际上是将它们粘贴到了这个数组中。如果您想看到在#include之后发生了什么,可以使用编译器的-E选项。所以如果这段代码在main.c中,您可以运行以下命令:

gcc -E -Ipath/to/headers -Iother/path/to/headers main.c

这将为您提供一个(可能很大的)源代码转储,这是将该文件通过预处理器并评估所有#include语句的结果。

编辑:错过了您的最后一个问题。

很可能(没有看到proclist.h就只是猜测),它定义的内容会更改proclist.h的内容。例如,如果它包含:

#ifdef PROCESS_TIMED
&function1_timed,
&function2_timed
#else
&function1,
&function2
#endif

那么 #define PROCESS_TIMED 会更改你的 m_exec 数组中的内容。


我们能否同时声明函数指针并定义函数,就像这样:'void (*voidFptr)(void) = { printf("Hello\n"); }' - Rajesh
通过定义函数,您本质上是在“声明函数指针”;如果您有 void voidf(void) { printf("Hello\n"); },那么 voidf&voidf 是等效和有效的函数指针。 - Haldean Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接