【问题标题】:Is there a "type name" for functions in C?C 中的函数是否有“类型名称”?
【发布时间】:2019-05-16 04:04:38
【问题描述】:

在 C 中可以定义一个函数指针,但是指针指向的内容是否有一个“类型名称”?

详细地说,可以有一个类型定义来代替void (*fubar)(void),以便可以将fubar 声明为Frob* fubar

【问题讨论】:

  • typedef void(Frob)(void); Frob *fubar;
  • 我认为链接到“Typedef 函数指针”是错误的,因为这个问题是针对指向的类型而不是指针。
  • VTRO。 Dupes 将类型名称引用到函数指针。这里为函数寻找类型名称。细微的差别。

标签: c function pointers


【解决方案1】:

函数指针没有标准类型名称,就像int 一样。此外,没有关键字来命名它们的标签,就像struct 一样。相反,如果您想按名称引用函数原型或指向函数的指针,则应使用 typedef

考虑以下typedef

typedef void Frob (void);

如果没有typedef 关键字,则声明将针对名为Frob 的函数的原型。对于typedef,名称Frob 现在是与该原型匹配的函数的类型别名。所以,可以这样使用:

Frob foo;
Frob *fubar = foo;
void foo (void) { puts(__func__); }
int main (void) { fubar(); }

一般来说,typedef 以这种方式工作,它可以将变量声明(无初始值设定项)转换为类型别名。

【讨论】:

    【解决方案2】:
    typedef void (*fubar_p)(void);
    

    void typedef (*fubar_p)(void);
    

    typedef void (fubar)(void);
    

    void typedef (fubar)(void);
    

    那你就可以了

    fubar_p fun_p;
    

    fubar *fun;
    

    在这两种情况下,funfun_p 的含义相同,指向函数的指针不带参数也不返回任何内容。

    【讨论】:

    • void typedef (*fubar)(void) 真的正确吗?除了名称之外,它看起来与 void typedef (*fubar_p)(void) 相同。
    【解决方案3】:

    只需 typedef 即可。

    typedef void(*Frob)(void);
    
    void f(void)
    {
        // your code goes here
    }
    
    int main()
    {
        Frob fubar = f;
        fubar();
        return 0;
    }
    

    【讨论】:

    • 这不能回答问题。问题是让Frob* fubarfubar 定义为函数指针。在您的情况下,这将成为指向函数指针的指针。
    • 除了“星号”之外,语法和行为是相同的。
    • 为什么这很重要?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2020-02-28
    • 2014-10-12
    • 2013-10-14
    相关资源
    最近更新 更多