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

Raj*_*esh 3 c mingw codeblocks

我在其中一个旧文件中看到了一段代码.

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
   }; 
Run Code Online (Sandbox Code Playgroud)

我无法理解这段代码的含义.这是一个带声明和函数定义的函数指针吗?但是,如果我尝试声明类似的函数指针,我得到编译错误

void (*voidFptr)(void) =
{
    printf("Hello\n");
}
Run Code Online (Sandbox Code Playgroud)

那么#define在这里是什么?为什么这是我不确定的功能.

Hal*_*own 7

这个:

void (*const m_exec[N_EXECS])(void)
Run Code Online (Sandbox Code Playgroud)

是你在C中声明一个函数指针数组的方式.你并不是唯一一个难以阅读的人.它声明了一个长度数组N_EXECS,其中数组中的每个元素都是一个不带参数的函数,并返回一个指向const-void的指针.

其后的括号内的块是数组初始化器; 可能proclist.h有一个完整的函数指针声明列表,这实际上是将它们粘贴到这个数组中.如果你想看看之后发生了什么#include,你可以使用-E编译器的标志.所以如果这个main.c,你会运行:

gcc -E -Ipath/to/headers -Iother/path/to/headers main.c
Run Code Online (Sandbox Code Playgroud)

它会给你一个(可能是巨大的)源代码转储,这是通过预处理器推送该文件并评估所有#include语句的结果.

编辑:错过了你的上一个问题.

可能(这是猜测而没有看到proclist.h),其定义的东西改变了内容proclist.h.例如,如果它包含:

#ifdef PROCESS_TIMED
&function1_timed,
&function2_timed
#else
&function1,
&function2
#endif
Run Code Online (Sandbox Code Playgroud)

然后#define PROCESS_TIMED会改变你m_exec阵列中的内容.