声明符

在c或c++中,声明由两部分组成:声明修饰符声明符

如:
static unsigned long int *x[N];

其中:static unsigned long int为声明修饰符,*x[N]为声明,一个声明符通常由()[ ], * 组成,至于*x[N]遵循如下规则:

声明符中的符号遵循着相同的优先级规则。

其中:[ ]的优先级高于,因此x[N]*代表 :x是一个有N个元素的数组,数组的每个元素是指针**

()有两个作用:
1、作为函数调用的操作符;
2、作为一个组

作为函数调用()和[ ]的优先级相同,作为组,()优先级最高

如:*f(int)表示一个函数f,参数为int型,返回值是一个指针,相反,(*)f(int)表示一个指向函数的指针

声明修饰符

声明修饰符包括int,unsigned,extern,static等等在c++中也可以是inlinevirtual

类型修饰符作用于说明符ID的类型,其他修饰符提供非类型信息直接作用于说明符ID

如:static unsigned long int *x[N];

声明x是一个有N个元素的数组,这N个元素是指针类型,指针指向无符号长整型,关键词 static 修饰x有静态分配内存

声明修饰符在声明中的顺序是无关紧要的

如:const VP vectorTable[ ]等价于VP const vectorTable[ ]

   const void *vectorTable[ ] 等价于void const *vectorTable[ ]

我们大多数人把像static这样的存储类型限定符放在最左边作为第一个声明修饰符,这只是一个惯例并非语言本身的要求。

声明修饰符const和volatile的不同之处在于:

只有**const和volatile可以寄既做声明修饰符又做声明符**

如:void *const vectorTable[ ];

出现在声明符中,在此情形,不可交换关键字的顺序

      const *void vectorTable[ ]这种写法是错误的

一种清晰的风格

1.const void *vectorTable[ ];

2.void c *onst vectorTable[ ]

这两种写法等价,但第二种是值得推荐的一种。指针声明是从右至左读的,把const放在右边就可以严格按从右至左的顺序读指针,更加清晰明了。

对比下面两种写法:

1.const int* P;

2.const int *P;

推荐第二种写法,和空格相连会带来一些问题,*意识到声明修饰符和声明符的分界点是理解声明符一个重要关键之一。第一种用空格分开会令人迷惑。

本文主要参考Embedded Systems Programming中Dan Saks的const T VS. T const一文