簡體   English   中英

如何閱讀“ int(* functionFactory(int n))(int,int){…}”?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM