2.7 怎樣建立和理解非常複雜的聲明?例如定義一個包含 N 個指向返 回指向字符的指針的函數的指針的數組?

這個問題至少有以下 3 種答案:
  1. char *(*(*a[N])())();
  2. 用 typedef 逐步完成聲明:
        typedef char *pc;       /* 字符指針           */
        typedef pc fpc();       /* 返回字符指針的函數 */
        typedef fpc *pfpc;      /* 上面函數的指針     */
        typedef pfpc fpfpc();   /* 返回函數指針的函數 */
        typedef fpfpc *pfpfpc;  /* 上面函數的指針     */
        pfpfpc a[N];	    /* 上面指針的數組     */
    

  3. 使用 cdecl 程序, 它可以把英文翻譯成 C 或者把 C 翻譯成英文:
        cdecl> declare a as array of pointer to function returning
           pointer to function returning pointer to char
        char *(*(*a[])())()
    
    通過類型轉換, cdecl 也可以用於解釋複雜的聲明, 指出參數應該進入哪一對括號  (如同在上述的複雜函數定義中)。參見問題 18.1
一本好的 C 語言書都會解釋如何 ``從內到外'' 解釋和理解這樣複雜 的 C 語言聲明 (``模擬聲明使用'')。

上文的例子中的函數指針聲明還沒有包括參數類型信息。如果參數有複雜類型, 聲明就會變得真正的混亂了。現代的 cdecl 版本可以提供幫助。

參考資料: [K&R2, Sec. 5.12 p. 122]; [ISO, Sec. 6.5ff (esp. Sec. 6.5.4)]; [H&S, Sec. 4.5 pp. 85-92, Sec. 5.10.1 pp. 149-50]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)