[英]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.