C语言中的typedef方程
我有以下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
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的指针