【问题标题】:Using typedefs to simplify declarations: int *(*x[10])(void);使用 typedef 来简化声明: int *(*x[10])(void);
【发布时间】:2012-01-17 07:14:14
【问题描述】:

有人能解释一下当我们使用 typedef "type 时发生了什么吗? cast”语法?

typedef int (*funcptr)(double); (维基) funcptr x = (funcptr) NULL;

pg470,K.N.King - 现代方法

typedef int *Fcn(void); typedef Fcn *Fcn_ptr; typedef Fcn_ptr Fcn_ptr_array[10]; fcn_ptr_array x;

不是吗:

typedef 旧类型新类型; typedef int 布尔值;

那么:typedef int * Fcn(void) 有什么意义呢? 通常: int *Fcn(void),将是一个函数“Fcn”,它没有 参数并返回一个指向 int 的指针。如果我坚持 typedef 什么 发生了什么??

funcptr 是一个指针变量.. 它不是一个类型..?那他怎么施法 NULL 到 (funcptr)????这种语法是否在某处清楚地解释过 - K.N.King 只是猛烈抨击你而没有提及这种特殊的语法 任何地方..

【问题讨论】:

    标签: c


    【解决方案1】:

    来自《C语言参考手册》第7章:

    带有存储类说明符 typedef 的声明不定义存储。 typedef 具有以下语法:typedef-name: identifier。出现在 typedef 声明中的标识符成为该类型的同义词,而不是成为具有给定类型的对象。

    所以 typedef int (*funcptr)(double) 表示funcptr是一个函数指针,该函数有一个参数double,返回类型为int。

    【讨论】:

      【解决方案2】:

      typedef int (*funcptr)(double);funcptr 定义为函数指针,其中指向的函数采用double 类型的单个参数,并返回int

      否则x 必须声明为:int (*x)(double)。它使您不必每次在某个地方需要这种类型的变量时都必须全部输入。更不用说它可以更轻松地更改您的代码。

      您可以将NULL 分配给任何 类指针,以表明您的指针没有指向任何有效的位置(funcptr x = (funcptr) NULL;)。 NULL 将被定义为 void* 到一个无效的内存位置,您不需要将其转换为将其分配给 x


      您的第二个示例只是将typedef 分解为更多步骤,结果是typedef 用于函数指针数组。

      【讨论】:

        【解决方案3】:

        在 C 中定义 typedef 的语法与变量的定义相同,但前面带有关键字 typedef

        所以,例如:

        int a[10];
        

        a 声明为array-of-10-ints 类型的变量,然后如下:

        typedef int b[10];
        

        b 定义为array-of-10-ints 类型。

        函数类型也是如此:

        int f(double);
        

        f 声明为接收double 并返回int 的函数。那么:

        typedef int g(double);
        

        g定义为此类函数的类型。

        自然不能声明函数类型的变量,所以下面的说法是不正确的:

        g ag; //Error
        

        但是你可以用它来声明指针函数类型的变量:

        g *pg; //OK
        

        这就是为什么通常首选首先将 typedef 设置为指向函数的指针:

        typedef int (*k)(double);
        

        这里的k 是一个指向函数的指针,它接收一个double 并返回一个int。 这样你就可以声明一个变量pg 等同于avobe:

        k pg;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-17
          • 2011-10-12
          • 2020-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多