函数指针声明和函数定义在一起
我在其中一个旧文件中看到了一段代码.
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("Hellon"); } 那么#define在这里是什么?为什么这是我不确定的功能. 解决方法
这个:
void (*const m_exec[N_EXECS])(void) 是你在C中声明一个函数指针数组的方式.你并不是唯一一个难以阅读的人.它声明了一个长度为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数组中的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |