加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:04:24 所属栏目:百科 来源:网络整理
导读:我在其中一个旧文件中看到了一段代码. 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"
我在其中一个旧文件中看到了一段代码.

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数组中的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读