【问题标题】:Why typedef for a function pointer is different from a regular typedef?为什么函数指针的 typedef 与常规 typedef 不同?
【发布时间】:2015-08-23 06:36:43
【问题描述】:

typedef 经常像这样工作:typedef <type> <type_alias>。但是函数指针的 typedef 似乎有不同的结构:typedef int (*fn)(char *, char *); - 没有类型别名,只有一个函数签名。

示例代码如下:

#include <stdio.h>

typedef void (*callback)(int);

void range(int start, int stop, callback cb) {
    int i;
    for (i = start; i < stop; i++) {
        (*cb)(i);
    }
}

void printer(int i) {
    printf("%d\n", i);
}

main(int argc, int *argv[])
{
    if (argc < 3) {
        printf("Provide 2 arguments - start and stop!");
    }

    range(atoi(argv[1]), atoi(argv[2]), printer);
}

那么 - 为什么函数指针的typedefs 不同?

【问题讨论】:

  • 与声明函数指针变量的方式相同。

标签: c pointers function-pointers typedef


【解决方案1】:

使用typedef 定义函数指针类型的语法与定义函数指针的语法相同。

int (*fn)(char *, char *);

fn定义为指向函数...的指针

typedef int (*fn)(char *, char *);

fn定义为一个指向函数...的类型

【讨论】:

    【解决方案2】:

    它的工作原理相同。你只需要以稍微不同的方式看待它。 typedef 定义您自己的类型名称,方法是将其准确放置在没有typedef 的变量标识符所在的位置。所以

    uint8_t foo;
    

    变成

    typedef uint8_t footype;
    footype foo;
    

    编辑:所以“R Sahu”要快一点,请参阅他的示例,了解应用于函数指针的相同原理。

    【讨论】:

    • 能否给个标准参考?
    • 6.7.7 p3中指定。 (关键短语:“以 6.7.5 中描述的方式”)
    • here, typedef void fv(int), (*pfv)(int); - 注意,第二个函数声明没有返回类型。事实证明,typedefvoid 类型与以下函数签名相关联。所以你可以写typedef void fn1(int), (*fnptr1)(int), fn2(char *), ...;
    • 这只是逗号在声明中的正常工作方式。删除typedef,看看是什么意思。
    • 顺便说一句,一个完美的例子展示了 C 声明如何看起来真的被混淆了。这可能是sites like this 存在的原因;) [注意这个网站不理解逗号...哈哈]
    【解决方案3】:

    C 声明语法比type identifier 复杂得多,例如

    T (*ap)[N];             // ap is a pointer to an N-element array
    T *(*f())();            // f is a function returning a pointer to
                            // a function returning a pointer to T
    

    在语法上,typedef 被视为存储类说明符,如 staticextern。所以你可以在上面的每一个中添加typedef,给

    typedef T (*ap)[N];     // ap is an alias for type "pointer to N-element array
    typedef T *(*f())();    // f is an alias for type "function returning
                            // pointer to function returning pointer to T"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多