你怎么读C声明?

172*_*729 42 c typedef cdecl

我听说过一些方法,但都没有卡住.我个人试图避免C中的复杂类型,并尝试将它们分解为组件typedef.

我现在面临着从一个所谓的"三星级程序员"维护一些遗留代码的问题,而且我很难阅读一些***代码[] [].

你如何阅读复杂的C声明?

Eli*_*ght 33

本文解释了一个相对简单的7条规则,如果您发现自己需要或需要手动执行此操作,它将允许您阅读任何C声明:http://www.ericgiguere.com/articles/reading-c-declarations.html

  1. 找到标识符.这是你的出发点.在一张纸上,写"声明标识符为".
  2. 向右看.如果那里没有任何东西,或者右括号")",请转到第4步.
  3. 您现在位于数组(左括号)或函数(左括号)描述符上.可能存在这些序列,以不匹配的右括号或声明符的结尾(分号或"="表示初始化)结束.对于每个这样的描述符,从左到右阅读:

    • 如果一个空数组"[]",写"数组"
    • 如果一个大小的数组,写"数组大小"
    • 如果函数"()",写"函数返回"

    停在不匹配的括号或声明符的末尾,以先到者为准.

  4. 返回起始位置并向左看.如果那里什么也没有,或者左括号"(",转到第6步.
  5. 您现在位于指针描述符"*"上.左边可能有一个序列,以左括号"("或声明符的开头结束.从右到左阅读,每个指针描述符写"指向".停在不匹配的括号或声明者的开头,以先到者为准.
  6. 此时,您有一个带括号的表达式或完整的声明符.如果您有带括号的表达式,请将其视为新的起点并返回步骤2.
  7. 记下类型说明符.停止.

如果您对某个工具没问题,那么我建议使用该程序cdecl:http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html


sun*_*ica 22

我通常使用有时被称为"右手顺时针规则"的东西.它是这样的:

  • 从标识符开始.
  • 转到它的右边.
  • 然后顺时针方向移动到左侧.
  • 顺时针移动并向右移动.
  • 只要声明尚未完全解析,请执行此操作.

还有一个额外的元规则需要注意:

  • 如果有括号,请在移出前完成每个级别的括号.

在这里,"前进"和"移动"某处意味着在那里阅读符号.规则是:

  • * - 指向
  • () - 功能返回
  • (int, int) - 功能采取两个整数并返回
  • int,char等- int,char等等.
  • [] - 数组
  • [10] - 十个数组
  • 等等

因此,例如,int* (*xyz[10])(int*, char)读作:

xyz是一个

一排十

指针

函数接受一个int*和一个char并返回

一个int*

  • @sundar:您可以扩展它以包含多维数组和函数指针吗?那“extern char *const (*goop( char *b ))( int, long );”呢?(摘自http://www.ericgiguere.com/articles/reading-c-declarations.html) (2认同)

Dar*_*ari 6

一个字:cdecl

Damnit,被打15秒!


Pau*_*lin 3

当我做 C 语言时,我使用了一个名为“cdecl”的程序。它似乎位于 Ubuntu Linux 中的 cutils 或 cdecl 软件包中,并且可能在其他地方可用。