gpt4 book ai didi

c++ - 可以在声明中的什么位置放置存储类说明符?

转载 作者:IT老高 更新时间:2023-10-28 21:56:40 25 4
gpt4 key购买 nike

例如,让我们考虑 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;

关于c++ - 可以在声明中的什么位置放置存储类说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com