【问题标题】:Array as function with arguments?数组作为带参数的函数?
【发布时间】:2017-04-28 03:37:43
【问题描述】:

我正在努力学习 c,所以我尝试阅读一些源代码。
但我不知道这可能意味着什么:

static const char*(*const functab[])(void)={
        ram,date
};

第一部分,static const char* 很好,因为它似乎是一个函数(具有void 类型的参数),static 应该意味着它只在这个文件中可见,const char* 应该意味着值不能更改,但地址可以更改。
但在这种情况下,在函数名后面的最后一部分之后没有意义,就像

static const char * date(void);
static const char * ram(void);

不是函数名,而是 (*const functab[]),一个名为 functab 的包含地址的 const 数组?
这是某种包含函数 ram 和 date 的包装函数吗?声明数组的一些替代方法?

【问题讨论】:

  • 这可能会有所帮助:cdecl.org.
  • @paulortorrens 不,可能不会,那个网站很愚蠢。在 OP 的示例中尝试完美的代码,你会得到“语法错误”。我假设他们指的是 cdecl.org 源代码中的语法错误...
  • 原来 cdecl.org 无法识别 static 关键字。多么可悲。

标签: c arrays pointers constants function-pointers


【解决方案1】:

functab 是一个函数指针数组(准确地说是const 函数指针数组),它返回const char* 并且不接受任何参数。

稍后,

 ... = { ram, date };

是一个用大括号括起来的初始化器列表,用作数组的初始化器。

【讨论】:

  • 澄清一下,这不应该是:functab is and array of constant function pointers... ?
【解决方案2】:

这是在 C 中定义函数指针数组的方法。因此,不用像 ram() 那样调用函数,使用这个数组你可以通过 (* functab[1]) 调用它。

下面的讨论有很好的函数指针数组示例: How can I use an array of function pointers?

【讨论】:

    【解决方案3】:

    简答:这里functab 是一个函数指针数组,该数组用指向函数ramdate 的指针进行初始化。这也解释了可能来自“FUNCtion TABle”的名称 functab。

    长答案:在 C 语言中,您可以获取指向函数的指针并将其保存到变量中。以这种方式使用的变量称为函数指针。

    例如,下面的funcptr变量将包含do_stuff的入口点地址:

    int do_stuff(const char* x) { ...do stuff.. }
    ...
    ftype_t funcptr = &do_stuff;
    ...
    (*funcptr)("now");  // calls do_stuff()
    

    这只有在你已经定义了funcptr的类型时才有效,这里是ftype_t。类型定义应采用以下形式:

    typedef int (*ftype_t)(const char*);
    

    在英语中,这意味着ftype_t 被定义为一种以const char* 作为其唯一参数并返回int 的函数。

    如果您不想只为此而typedef,您可以通过以下操作实现相同的目标:

    int (*funcptr)(const char*) = &do_stuff; 
    

    这可行,但它的语法令人困惑。如果您尝试执行诸如构建函数指针数组之类的操作,它也会变得非常丑陋,而这正是您的代码所做的。

    下面是等价的代码,比较容易理解:

    typedef static const char*(*myfn_t)(void);
    
    const myfn_t functab[] = { &ram, &date };
    

    (&(地址)通常是可选的,但推荐使用。)

    【讨论】:

      【解决方案4】:

      复杂的变量声明需要在 C 中从里向外读取:

      • functab是变量的标识符,所以我们从这里开始读...

      • functab[]是一个数组...

      • *const functab[] 的常量指针...

      • (*const functab[])(...) 到函数...

      • (*const functab[])(void) 不带参数...

      • const char*(*const functab[])(void) 但返回 const char*

      static 的含义取决于它是在函数的外部还是内部。如果它在外部,static 表示functab 是在文件范围内声明的(即,仅在单个.c 文件中可见的全局变量)。如果它在函数内部,则意味着functab 是一个仅在该函数内部可见的全局变量。

      = { ram, date } 用两个成员初始化数组。 ramdate 都应该是声明为 const char* ram(void) 的函数。

      此声明的效果是,以下函数调用是等效的:

      const char* result = ram();
      const char* result = functab[0]();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 2010-11-20
        相关资源
        最近更新 更多