2012-02-01 53 views
1

我在c中有下面的typedef聲明,但是我怎麼讀取這些聲明是困惑的。typedef在C中的公式

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]; 

現在對我來說,前兩句話很容易閱讀,但後來很困惑。

有什麼辦法可以解決(讀)這樣的方程嗎?

+4

這可能是一個模糊比賽的好候選人。 – Mysticial 2012-02-01 10:09:10

+0

'a'是一個指向函數指針的指針數組,返回一個指向函數指針的指針,返回一個指向'char'的指針。我覺得我應該睡一會兒,然後纔會對此失去信心...... – Mysticial 2012-02-01 10:29:22

+0

複製粘貼來自http://c-faq.com/decl/cdecl1.html,downvote。 – Bort 2012-02-01 13:02:14

回答

1
typedef char *pc;  /* pc is pointer to char      */ 
typedef pc  fpc(); /* fpc is function returning pointer to char */ 

好爲止。請注意,最後的typedef也可以寫爲

typedef char *fpc(); 

接着,

typedef fpc *pfpc; 

聲明pfpc作爲指針以fpc。因爲我們知道,fpc是返回一個指針char功能,然後pfpc必須是一個指針,返回指針char功能,或

typedef char *(*pfpc)() 

接下來我們

typedef pfpc fpfpc(); 

這一次,fpfpc是返回pfpc的函數。因爲我們知道,pfpc是一個指向返回指針char功能,fpfpc必須返回一個指針返回指針char功能的功能,或

typedef char *(*fpfpc())(); 

接下來,我們

typedef fpfpc *pfpfpc; 

,它聲明pfpfpc作爲指向fpfpc的指針。因爲我們知道fpfpc是返回一個指針返回指針char功能的功能,pfpfpc必須是一個指向返回一個指向函數的指針返回char功能,或

typedef char *(*(*pfpfpc)())(); 

最後,我們有的pfpfpc

pfpfpc a[N]; 

一個的N個元素的數組既然我們知道pfpfpc是指向返回指針返回指針char功能的功能,則a必須點的N元件陣列ERS在返回指針返回指針的函數來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 *(*(*)())() 

最後一步不是非常直觀,我承認。

1
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 

更好的名稱可能會有所幫助:)
我意識到這是示例代碼。在真實的代碼中使用可理解的命名約定。

+0

你如何閱讀他們,我想知道什麼? – 2012-02-01 10:17:17

+0

@AmitSinghTomar'a'是一個函數指針數組,返回一個指向函數指針的指針,返回一個指向'char'的指針。我有沒有得到那個權利? – Mysticial 2012-02-01 10:18:52

+0

我在上面的評論中閱讀了他們。我不會遞歸地閱讀它們。 – pmg 2012-02-01 10:19:29

1

糾正我,如果我錯了,但它看起來像下面這樣:

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 */ 

除了這個,看看這個博客條目,(http://blog.feabhas.com/2009/12/unscrambling-c-declarations /)

+0

想要如何閱讀這些陳述?任何具體的方式來做到這一點? – 2012-02-01 10:29:44

+0

看看我剛​​剛添加的鏈接:)詳細解釋了有關解密C聲明。一旦你掌握了這一點,就會擴大每個'typedef'以包含最後一個。 – 2012-02-01 10:35:10

0

這是怎麼了聲明int類型的變量x:

int x; 

這是你如何聲明一個函數f,返回的整數,並且帶有一個整數參數:

int f(int); 

這就是你的typedef一個int

typedef int size_t; 

這是怎麼的typedef返回一個整數,並採取一個整數參數

typedef int f_int_int_t(int); 
1

您可以使用the "right-left rule"破譯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步:查看標識符右側的符號。例如,如果您在那裏找到「()」,那麼您知道這是 函數的聲明。所以你會有「標識符是函數返回」。 或者如果您在那裏找到了「[]」,您會說「標識符是數組」。 繼續下去,直到您用盡符號命中正確 括號「)」。 (如果你打一個左括號,這就是 開頭()符號的,即使有東西在 括號之間更多的是下面。)

第3步:看符號的左邊標識符。如果它不是我們上面的符號之一(比如說「int」),就說出來。 否則,請使用上面的表格將其翻譯成英文。保持 走左邊,直到你用完了符號OR的命中左括號 「(」。

,直到你形成你的宣言現在重複步驟2和3。

這是也是在http://www.codeproject.com/Articles/7042/How-to-interpret-complex-C-C-declarationshttp://www.cs.uoregon.edu/Classes/03F/cis399/notes/right-left.html描述。