C语言中的typedef方程

C语言中的typedef方程,c,C,我有以下c语言中的typedef声明,但我对如何阅读这些声明感到困惑 typedef char *pc; /* pc is pointer to char */ typedef pc fpc(); /* fpc is function returning pointer to char */ typedef fpc *pfpc; typedef pfpc fpfpc(); typedef fpf

我有以下c语言中的typedef声明,但我对如何阅读这些声明感到困惑

   typedef char  *pc;     /* pc is pointer to char                      */
   typedef pc     fpc();  /* fpc is function returning pointer to char  */
   typedef fpc   *pfpc;
   typedef pfpc   fpfpc();
   typedef fpfpc *pfpfpc;
   pfpfpc a[N];
现在对我来说,前两个陈述很容易理解,但之后真的很困惑

有没有办法解(读)这样的方程

   typedef char *pc;      // pc is pointer to char
   typedef pc fpc();      // fpc is function accepting unspecified arguments and returning pc
   typedef fpc *pfpc;     // pfpc is pointer to fpc
   typedef pfpc fpfpc();  // fpfpc is function accepting unspecified arguments and returning pfpc
   typedef fpfpc *pfpfpc; // pfpfpc is a pointer to fpfpc
   pfpfpc a[N];           // a is an array of N pfpfpc
更好的名字可能会有帮助:)
我意识到这是示例代码。在实际代码中,使用可理解的命名约定

更好的名字可能会有帮助:)

我意识到这是示例代码。在实际代码中,请使用可理解的命名约定。

如果我错了,请纠正我,但它看起来如下所示:

    typedef char *pc;           /* pc is pointer to char                     */
    typedef pc fpc();           /* fpc is function taking no arguments returing pointer to char  */
    typedef fpc *pfpc;          /* pfpc is a pointer to a function taking no arguments returning a pointer to a char */
    typedef pfpc fpfpc();       /* fpfpc is a function returning a pointer to a function taking no arguments returning a pointer to a char */
    typedef fpfpc *pfpfpc;      /* pfpfpc is a pointer to a function returning a pointer to a function taking no arguments returning a pointer to a char */
    pfpfpc a[N];                /* a is an array of pointers to functions returning a pointer to a function taking no arguments returning a pointer to a char */

除此之外,看看这篇博文,(/)

如果我错了,请纠正我,但它看起来如下所示:

    typedef char *pc;           /* pc is pointer to char                     */
    typedef pc fpc();           /* fpc is function taking no arguments returing pointer to char  */
    typedef fpc *pfpc;          /* pfpc is a pointer to a function taking no arguments returning a pointer to a char */
    typedef pfpc fpfpc();       /* fpfpc is a function returning a pointer to a function taking no arguments returning a pointer to a char */
    typedef fpfpc *pfpfpc;      /* pfpfpc is a pointer to a function returning a pointer to a function taking no arguments returning a pointer to a char */
    pfpfpc a[N];                /* a is an array of pointers to functions returning a pointer to a function taking no arguments returning a pointer to a char */

除此之外,看看这篇博客,(/)

这是如何声明int类型的变量x的:

int x; 
以下是如何声明函数f,该函数返回一个整数并接受一个整数参数:

int f(int);
这是您键入int的方式

typedef int size_t; 
这就是您键入定义一个返回整数并接受一个整数参数的函数的方式

typedef int f_int_int_t(int); 

以下是声明int类型变量x的方式:

int x; 
以下是如何声明函数f,该函数返回一个整数并接受一个整数参数:

int f(int);
这是您键入int的方式

typedef int size_t; 
这就是您键入定义一个返回整数并接受一个整数参数的函数的方式

typedef int f_int_int_t(int); 
您可以使用以一种简单而常规的方式破译C声明

阅读

 *    as "pointer to"         - always on the left side
 []   as "array of"           - always on the right side
 ()   as "function returning"     - always on the right side
当你在声明中遇到他们时

步骤1:找到标识符。这是你的出发点。然后对自己说,“标识符是。”你已经开始声明了

步骤2:查看标识符右侧的符号。如果,比如说,你在那里找到“()”,那么你知道这是一个 功能。因此,您将得到“标识符是函数返回”。 或者,如果您在那里找到一个“[]”,您会说“identifier is array of”。 继续向右行驶,直到符号用完或撞到右侧 括号“)”。(如果点击左括号,则为 ()符号的开头,即使在 括号。更多信息请参见下文。)

步骤3:查看标识符左侧的符号。如果它不是我们上面的符号之一(比如,类似于“int”)就说出来。 否则,使用上表将其翻译成英语。保持 向左走,直到符号用完或碰到左括号 “(”

现在重复第2步和第3步,直到形成声明

在和中也介绍了它。

您可以使用它以简单而常规的方式破译C声明

阅读

 *    as "pointer to"         - always on the left side
 []   as "array of"           - always on the right side
 ()   as "function returning"     - always on the right side
当你在声明中遇到他们时

第一步:找到标识符。这是你的出发点。然后对自己说,“标识符是。”你已经开始了你的声明

第二步:看一下标识符右边的符号,比如说,如果你在那里找到“()”,那么你就知道这是一个 所以你会有“标识符是函数返回的”。 或者,如果您在那里找到一个“[]”,您会说“identifier is array of”。 继续向右行驶,直到符号用完或撞到右侧 括号“)”。(如果点击左括号,则为 ()符号的开头,即使在 括号。更多信息请参见下文。)

步骤3:查看标识符左侧的符号。如果它不是我们上面的符号之一(比如,类似于“int”)就说出来。 否则,使用上表将其翻译成英语。保持 向左走,直到符号用完或碰到左括号 “(”

现在重复第2步和第3步,直到形成声明

在和中也对其进行了描述

到目前为止还不错。请注意,最后一个typedef也可以写成

typedef char *fpc();
其次,

pfpc
声明为指向
fpc
的指针。既然我们知道
fpc
是返回指向
char
指针的函数,那么
pfpc
必须是返回指向
char
指针的函数的指针,或者

typedef char *(*pfpc)()  
接下来是

typedef pfpc   fpfpc();
这次,
fpfpc
是一个返回
pfpc
的函数。因为我们知道
pfpc
是一个指向返回
char
指针的函数的指针,
fpfpc
必须是一个指向返回
char
指针的函数,或者

typedef char *(*fpfpc())();
typedef char *(*(*pfpfpc)())();
接下来,我们有

typedef fpfpc *pfpfpc;
它将
pfpfpc
声明为指向
fpfpc
的指针。因为我们知道
fpc
是一个返回指向
char
的函数指针的函数,pfpfpc必须是指向返回指向
char
的函数指针的函数指针,或者

typedef char *(*fpfpc())();
typedef char *(*(*pfpfpc)())();
最后,我们有一个N元素数组
pfpc

pfpfpc a[N];
由于我们知道
pfpfpc
是指向函数的指针,返回指向函数的指针,返回指向
char
的指针,因此
a
必须是指向函数的指针的N元素数组,返回指向函数的指针,返回指向
char
的指针:

char *(*(*a[N])())();
阅读和编写毛茸茸的声明时要记住的主要规则是
[]
()
的优先级高于
*
,因此

*a[]       -- is an array of pointer
(*a)[]     -- is a pointer to an array
*f()       -- is a function returning a pointer
(*f)()     -- is a pointer to a function
整个事情都被分解为

          a                -- a
          a[N]             -- is an N-element array
         *a[N]             -- of pointers
        (*a[N])()          -- to functions
       *(*a[N])()          -- returning pointer
      (*(*a[N])())()       -- to function
     *(*(*a[N])())()       -- returning pointer
char *(*(*a[N])())()       -- to char
走另一条路,我们有

         pfpfpc              -- is a synonym for
       *  fpfpc              -- is a synonym for
       *   pfpc()            -- is a synonym for
       *(* fpc)()            -- is a synonym for
       *(*pc())()            -- is a synonym for
char *(*(* )())()
我承认,最后一步不是很直观

到目前为止还不错。请注意,最后一个typedef也可以写成

typedef char *fpc();
其次,

pfpc
声明为指向
fpc
的指针。既然我们知道
fpc
是返回指向
char
指针的函数,那么
pfpc
必须是返回指向
char
指针的函数的指针,或者

typedef char *(*pfpc)()  
接下来是

typedef pfpc   fpfpc();
这次,
fpfpc
是一个返回
pfpc
的函数。因为我们知道
pfpc
是一个指向函数re的指针