C 声明语法方法解读
创始人
2024-06-22 20:31:41
0

在C++编程语言中,有很多功能的实现方法与其他语言有很多不同之处,尤其是和C语言相比,它的应用方法更加灵活,方便。在这里我们就为大家详细介绍了有关C++声明语法的相关方法。

一个声明为每个声明子都声明一个实体(entity),同时为那个实体给出一个名字,并且隐含的给出存储类,类型,和由说明符给出的其它特性。说明符和声明子一起决定了名字是否是一个对象,数组,指针,引用或函数。例如,

声明x为一个整型指针,f为一个函数返回一个整型。正是声明子*x和f()使类型x和f产生区别。

 

  1. int *x, f();  
  2. declarator: [ * [ const ] | & ]... direct-declarator  
  3. direct-declarator: declarator-id | ( declarator ) |  
  4. direct-declarator ( parameter-declaration-list ) |   
  5. direct-declarator [ constant-expression ]  
  6. A declarator-id is an identifier, possibly qualified:  
  7. declarator-id: [ nested-name-specifier ] identifier  
  8. nested-name-specifier: { class-or-namespace-name ::}... 

 

如果声明子是一个仅包含一个declarator-id的直接-声明子,那么这说明这个标识符具有decl-specifiers隐含的属性,而没有进一步的修饰。例如,在下面的C++声明语法中

int n;

声明子是n,这是一个只包含direct-declarator的declarator-id,因此根据含义,n的类型为整型。

如果声明子为其它形式,那么你可以按照下面的方法确定标识符的类型:首先,假设T为decl-specifiers隐含的类型,忽略friend或static等非类型属性,同时假设D为声明子。然后重复下面的步骤直到推导出D为一个declarator-id,此时T正是你所寻找的类型:#t#

1. 如果D形如(D1),那么用D1替换D。

2. 如果D形如* D1 或 * const D1,那么根据是否有const,用“指针,它指向T”或者“常量指针,它指向T”替换T,然后用D1替换D。

3. 如果D形如D1(参数-声明-列表),那么用参数由参数-声明-列表定义的、“返回T的函数”替换T,然后用D1替换D。

4. 如果D形如D1[常量-表达式],那么用元素个数由常量-表达式给出的“T数组”替换T,然后然后用D1替换D。

5. ***,如果声明子形如&D,那么用“T引用”替换T,然后用D1替换D。

作为一个示例,考虑下面的C++声明语法

int *f();

首先,T和D分别为int和*f(),因此D形如*D1,其中D1为f()。

你可能认为D可以形如D1() 或者 *D1。然而,如果D形如D1(),那么D1将不得不为*f,D1将是一个direct-declarator(因为本节开始处的语法注1规定只有direct-declarator前面是())。但是如果我们看看direct-declarator的定义注2,很明显它不能包含*。因此,D只能是*f(),它形如*D1,其中D为f()。

既然我们已经确定D1为f(),那么我们知道必须用“指针,它指向T”替换T,即“指针,指向整型”,同时用f()替换D。

至此我们还没有解析D为declarator-id,因此我们必须重复该过程。此时,D1只能是f,因此我们用“返回T的函数”替换T,它是一个“返回整型指针不带参数的函数”,然后用f替换D。

此时,D为declarator-id,因此推导结束。我们已经确定声明

int *f();

声明f的类型为“不带参数返回整型指针的函数”。另一个例子,声明

int* p, q;

具有两个声明子,*p和q。对于每个声明子,T都是int。对于***个声明子,D是*p,因此T变成“指针,它指向整型,”而D为p。声明p类型为“指针,它指向整型”。

我们单独分析第二个声明子,T还是int,D是q。很明显声明q为整型。

***,让我们分析§10.1.2/173中那个奇怪的例子:

double (*get_analysis_ptr())(const vector&);

分析C++声明语法过程可以分为下面五个步骤

1. T: double D: (*get_analysis_ptr())(const vector&)

2. T: 返回double带有 const vector& 参数的函数 D: (*get_analysis_ptr())

3. T: function returning double... (如前所示) D: *get_analysis_ptr()

4. T: 指针,它指向一个返回double...的函数 D: get_analysis_ptr()

5. T: 一个函数,返回一个函数指针,它指向一个返回double...的函数 D: get_analysis_ptr

get_analysis_ptr是一个函数,它返回一个函数指针,它指向一个返回double,带有const vector&参数的函数。我们将如何展开const vector&作为一个练习。幸运的是,C++声明语法如此令人迷惑;它们中的大多数看起来

declarator: declarator-id ( parameter-declaration-list )

到目前为止,常见情况中最难的是返回函数指针的函数。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...