C复杂声明解析

转载 2006年05月17日 15:30:00

复杂的C声明一般被认为不是很好的编程习惯,当然也就不推荐使用。但是在读很多前辈遗留的代码时,又不得不面对这一问题。知道总比不知道好,我们还是来看看分析复杂C语言声明的规则吧,用例子分析最直观。

一、“right-left”规则
看过《C专家编程》中的分析规则,用起来并不是很舒服,遂在网上寻找,发现还有一个著名的“right-left”规则。规则经翻译总结后如下:

“right-left”规则:
0. 规则中符号
 *  读作 “指向...的指针”  
 []   读作 “...的数组”  
 ()  读作 “返回...的函数”
1. 起始点
 找到声明中的标识符(Identifier),它就是你分析的起始点,读作:“$(Identifier)是...”;

2. 右边
 看你的标识符右边
 a) 如果发现“()”,你将知道这是一个函数声明,这时你可以说“$(Identifier)是返回...的函数”;
 b) 如果发现“[]”,你将知道这是一个数组声明,这时你可以说“$(Identifier)是...的数组”;
 c) 继续向右,直到遇到右边声明结束或者遇到“)”,继续下面。
3. 左边
 看你的标识符左边
 a) 如果碰到的不是我们在0.中定义的符号,则直接说出它;否则按照0.中定义的符号含义说出。继续向左,直到遇到左边声明结束或“(”。
4. 重复2和3的步骤,直到声明分析完毕。

二、例子详解
我们从简单到复杂,循序渐进。
[Example 1] int *p[];
1) 找到标识符:p,读作:“p是...”;
2) 向右看:发现一“[]”,然后遇到右边声明结尾,读作:“p是...的数组”;
3) 向左看:发现一“*”, 读作:“p是指向...的指针的数组”;
4) 继续向左看:没有发现0.中定义的符号,则分析结束,读作:“p是指向int类型的指针的数组”。

[Example 2] int *(*func())();
1) 找到标识符:func,读作:“func是...”;
2) 向右看:发现一“()”,然后遇到“)”,读作:“func是返回...的函数”;
3) 向左看:发现一“*”,然后遇到“(”,读作:“func是返回指向...的指针的函数”;
4) 向右看:发现一“()”,然后右边声明结束,读作:“func是返回指向返回...的函数的指针的函数”;
5) 向左看:发现一“*”,读作:“func是返回指向返回指向...的指针的函数的指针的函数”;
6) 向左看:没有发现.中定义的符号,则分析结束,读作:“func是返回指向返回指向int类型的指针的函数的指针的函数”。

三、常见不合法的声明符号组合
包括:
 []() - cannot have an array of functions
 ()() - cannot have a function that returns a function
 ()[] - cannot have a function that returns an array


教你如何理解复杂的C/C++声明

曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的  C/C++声明:我们将从每天都能...
  • zheng_guan
  • zheng_guan
  • 2016年11月20日 23:58
  • 467

C语言中的复杂声明和定义,以及如何使用typedef进行简化

在阅读Linux的内核代码是经常会遇到一些复杂的声明和定义,诸如:         (1)  void * (* (*fp1) (int)) [10];         (2)  float (* (...
  • skywalker_leo
  • skywalker_leo
  • 2015年09月21日 10:12
  • 1916

C复杂声明解析

复杂的C声明一般被认为不是很好的编程习惯,当然也就不推荐使用。但是在读很多前辈遗留的代码时,又不得不面对这一问题。知道总比不知道好,我们还是来看看分析复杂C语言声明的规则吧,用例子分析最直观。一、“r...
  • lqk1985
  • lqk1985
  • 2008年06月12日 03:51
  • 739

C语言复杂声明的解析

C语言复杂声明的解析(刘爱贵 Aiguille.LIU)  C语言是一种通用的程序设计语言,它与UNIX系统之间具有非常密切的联系,C语言是在UNIX系统上开发的,并且,无论是UNIX系统本身还是运行...
  • liuben
  • liuben
  • 2008年04月10日 18:13
  • 2501

C/C++ 复杂的声明

入门阶段,看见类似void * (*(*fp1)(int))[10];的复杂声明,晕
  • chenfeng0104
  • chenfeng0104
  • 2014年07月27日 15:00
  • 1207

C语言难点专题——复杂的函数声明

类似void(*signal(int, void(*)(int)))()的说明, 经典或者不经典的书籍, 都有过解读, 《C专家编程中》, 设定了一套长长的解读规则, 记住它恐怕绝非易事, 后面终于在...
  • ostrichmyself
  • ostrichmyself
  • 2010年03月21日 09:55
  • 2247

C语言复杂声明解析

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的...
  • superghost
  • superghost
  • 2008年11月12日 09:42
  • 380

解析C语言复杂声明

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面 的内容,它是从C标准的声明规定中归纳出来的方法。C...
  • hongweilinux
  • hongweilinux
  • 2011年08月25日 14:46
  • 107

c语言 复杂声明 解析

转自 cOffee1982C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过 ,右左法则其实并不是C标准里面的内容,它是从C标准的声...
  • wangyangtao
  • wangyangtao
  • 2011年02月27日 12:38
  • 378

C复杂声明解析(ZZ)

一、“right-left”规则看过《C专家编程》中的分析规则,用起来并不是很舒服,遂在网上寻找,发现还有一个著名的“right-left”规则。规则经翻译总结后如下:“right-left”规则:0...
  • TrueLie
  • TrueLie
  • 2006年06月06日 22:26
  • 777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C复杂声明解析
举报原因:
原因补充:

(最多只允许输入30个字)