例如,让我们考虑static
存储类说明符。以下是此存储类说明符有效和格式错误的用法的一些示例:
static int a; // valid
int static b; // valid
static int* c; // valid
int static* d; // valid
int* static e; // ill-formed
static int const* f; // valid
int static const* g; // valid
int const static* h; // valid
int const* static i; // ill-formed
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
(标记为“有效”的声明已被Visual C++ 2012,g++ 4.7.2和Clang++ 3.1接受。标记为“病态”的声明被所有这些编译器拒绝。)
这似乎很奇怪,因为存储类说明符适用于声明的变量。声明的变量是
static
,而不是声明的变量的类型。为什么e
和i
格式错误,但k
格式正确?管理存储类说明符有效放置的规则是什么?尽管在此示例中使用了
static
,但该问题适用于所有存储类说明符。最好,完整的答案应引用C++ 11语言标准的相关部分并进行解释。 最佳答案
总之,在声明说明符中的任何位置(请参见ISO/IEC 14882-2012中的7.1节),即*
之前。 *
之后的限定符与指针声明符而不是类型说明符相关联,并且static
在指针声明符的上下文中没有意义。
考虑以下情况:
您可以在同一声明列表中声明普通int和指向int的指针,如下所示:
int a, *b;
这是因为类型说明符是
int
,所以您有两个使用该类型说明符int
,a
和声明指针*a
的声明,该声明符声明了指向int
的指针。现在考虑:int a, static b; // error
int a, *static b; // error
int a, static *b; // error
看起来应该是错误的(实际上),原因(在7.1和8.1节中定义)是因为C和C++要求您的存储说明符与类型说明符一起使用,而不是在声明符中。
因此,现在应该清楚,以下内容也是错误的,因为以上三个内容也是错误的:
int *static a; // error
最后一个例子
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
因为
pointer
类型定义为类型说明符,并且您可以按任何顺序放置类型说明符和存储说明,所以它们都是有效的,并且都是等效的。请注意,它们既等效又等同于说static int *j;
static int *k;
要么
int static *j;
int static *k;