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在这里是什么?为什么这是我不确定的功能.
这个:
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阵列中的内容.