[英]How Do I Read “int (*functionFactory(int n))(int, int) { … }”?
这是一个语法问题。 我强调,我想了解如何阅读下面的代码。
我在尝试理解以下代码(1)如何转换为其下的代码(2)时遇到了很大的麻烦:
代码零:
int addInt(int n, int m) {
return n+m;
}
代码一:
// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}
代码二:
typedef int (*myFuncDef)(int, int);
// note that the typedef name is indeed myFuncDef
myFuncDef functionFactory(int n) {
printf("Got parameter %d", n);
myFuncDef functionPtr = &addInt;
return functionPtr;
}
我在努力挣扎着两块,这就是为什么。 我已经将上面的代码修改为我认为它们应该是什么样子。
没有Typedef的显式函数定义(应与title相同:
代码4:
int (*myFuncDef)(int, int) functionFactory(int n) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}
代码5:typedef本身(用于简化代码2):
typedef int (*myFuncDef)(int, int) myFuncDef;
请注意,这些规定了基本规则: 返回类型,idenitifer,参数。
我非常希望能找到一个链接,在这里我可以阅读有关这一切如何实现的严格规则。 概述说明将是很棒的,因为该规范未提供类似课程的“教程”。 非常感谢你!
[EDIT]另外,
注意,这些摘录来自: C中的函数指针如何工作?
int (*functionFactory(int n))(int, int) { … }?
Remember these rules for C declares
And precedence never will be in doubt
Start with the Suffix, Proceed with the Prefix
And read both sets from the inside out
(当然,除非父母说“先做这个”)。
所以:functionFactory是
[open paren]
[suffix (int n)] a function taking an `int` argument called `n` that returns
[prefix *] a pointer to
[close paren]
[suffix (int, int)] a function taking two `int` arguments and returning
[prefix int] an integer
其后的{...}
给出了functionFactory
行为的定义。
(我们可能已经从名称functionFactory
猜测出它将要返回指向函数的指针。我们也可能已经查看了其逻辑以查看其返回的类型。)
Typedef使用与变量声明完全相同的语法,新的类型名称替换了变量名称,并且(当然)替换了它们前面的typedef
关键字。 该工厂返回的类型的函数指针将具有
int (*functionFromFactory)(int,int); /* oops, forgot parens the first time */
所以该类型的指针的typedef将是
typedef int (*PtrToFunctionFromFactory)(int,int);
请注意,一旦有了该类型,就可以将functionFactory
的声明简化为
PtrToFunctionFromFactory functionFactory(int n) {...}
(假定此类函数的名称比“工厂中的函数”更好,而且该名称确实应该在typedef和factory方法的名称中使用,但是由于您没有给我们任何更好的工作方法,我有点过于抽象了。)
希望能有所帮助。
“从里到外,从右到左。”
从声明的名称开始,在该级别的从右到左是“将一个int返回指针的函数...”,从一个级别“ ...到将两个int返回指针的函数”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.