使用typedef简化声明:int *(* x [10])(void);

时间:2011-12-10 06:34:46

标签: c

有人可以解释当我们使用typedef“类型时发生了什么 施放“语法?


    typedef int (*funcptr)(double); (Wiki)
    funcptr x = (funcptr) NULL;

OR

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


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

不是吗:


    typedef oldtype newtype;
    typedef int Bool;

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

funcptr是一个指针变量..它不是一个类型..?他怎么能投 NULL到(funcptr)????这个语法在某处清楚地解释了 - K.N.King在没有提到这种特殊语法的情况下抨击它 任何地方..

3 个答案:

答案 0 :(得分:2)

来自“C语言参考手册”,第7章:

  

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

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

答案 1 :(得分:2)

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

所以,例如:

int a[10];

a声明为array-of-10-ints的变量,然后执行以下操作:

typedef int b[10];

b定义为10-int的类型数组。

功能类型也是如此:

int f(double);

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

typedef int g(double);

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

当然,您无法声明 function 类型的变量,因此以下内容不正确:

g ag; //Error

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

g *pg; //OK

这就是为什么通常首选使typedef成为指向函数的指针:

typedef int (*k)(double);

这里k是一个指向函数的指针,它接收一个double并返回一个int。 通过这种方式,您可以声明与avobe等效的变量pg

k pg;

答案 2 :(得分:0)

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

否则int必须声明为:x。每次你想要一个这种类型的变量时,它就不必每次都输入这个。更不用说它使您的代码更容易更改。

您可以将int (*x)(double)分配给任何类型的指针,以指示您的指针未指向任何有效位置(NULL)。 funcptr x = (funcptr) NULL;将被定义为无效内存位置的NULL,您无需将其强制转换为void*


你的第二个例子只是将x分成几个步骤,结果是一个函数指针数组的typedef