例如,让我们考虑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,而不是声明的变量的类型。为什么ei格式错误,但k格式正确?

管理存储类说明符有效放置的规则是什么?尽管在此示例中使用了static,但该问题适用于所有存储类说明符。最好,完整的答案应引用C++ 11语言标准的相关部分并进行解释。

最佳答案

总之,在声明说明符中的任何位置(请参见ISO/IEC 14882-2012中的7.1节),即*之前。 *之后的限定符与指针声明符而不是类型说明符相关联,并且static在指针声明符的上下文中没有意义。

考虑以下情况:
您可以在同一声明列表中声明普通int和指向int的指针,如下所示:

int a, *b;

这是因为类型说明符是int,所以您有两个使用该类型说明符inta和声明指针*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;

10-08 14:06