C 为什么可以';静态和寄存器存储类不能一起使用吗?

C 为什么可以';静态和寄存器存储类不能一起使用吗?,c,compilation,storage-class-specifier,C,Compilation,Storage Class Specifier,以以下方式定义变量时: static register int a1 = 0; 我们得到一个错误: error: multiple storage classes in declaration specifiers 这个错误有什么根本原因吗?为什么变量不能既存储在寄存器中,又只能在启动/第一次调用时初始化?可以将寄存器存储类附加到全局变量 如果一个编译器忠实地实现了您想要的,那么它将占用一个CPU寄存器来计算程序的长度。那几乎不实际 请记住,register只是一个建议。该标准不允许在声明中

以以下方式定义变量时:

static register int a1 = 0;
我们得到一个错误:

error: multiple storage classes in declaration specifiers

这个错误有什么根本原因吗?为什么变量不能既存储在寄存器中,又只能在启动/第一次调用时初始化?可以将寄存器存储类附加到全局变量 如果一个编译器忠实地实现了您想要的,那么它将占用一个CPU寄存器来计算程序的长度。那几乎不实际


请记住,
register
只是一个建议。

该标准不允许在声明中使用多个存储类说明符

根据C99标准:

6.7.1存储类说明符

1存储类说明符:

2在一个声明的声明说明符中最多可以给出一个存储类说明符


主要原因是寄存器限定符意味着变量具有自动存储持续时间。它基本上是一个自动变量,您要告诉编译器,最好将它放在通用CPU寄存器中

static限定符表示静态或线程存储持续时间

显然,如果应用于同一个变量,这两者是不兼容的


这就像要求一个变量在其所属的激活记录被删除时死亡并存活(同时)。

起初,这没有完全意义,因为我认为全局寄存器定义确实可以编译,但现在我检查并发现所有内容都是一致的:)从某种意义上说,这是一个很好的答案(加一),但它并没有真正解决原因。@Bathsheba,不幸的是,我没有完全理解这样做的理由。你的回答对于不允许
静态
寄存器
是有意义的。我不理解如果我们合并其他线程可能会出现的问题。在C11中,这不再正确,因为
\u Thread\u local
可以合并使用
static
extern
@fuzzxl,很高兴知道。感谢您提供的信息。@Lundin,错。
register
是一个存储类,而不是存储持续时间。
register
对象具有自动存储持续时间。我不同意您的观点。正如
static
存储类适用于静态或线程存储d一样持续时间,
register
也可以这样做。
register
唯一真正的约束意味着
&
可能不会应用于对象,因此您可以保证没有别名。这对静态对象是有意义的。事实上,我有一个C2x的建议,这暗示了这一点。@JensGustedt啊,没错,这没有什么意义从某种意义上说,我被术语迷住了。我想说的是,
register
auto
都是存储类说明符,不能组合。
auto register int x;
不会编译。@Lundin这本身不是一个原因,
static
\u Thread\u local
允许同时使用,
static
寄存器
不是(目前).@JensGustedt对于您描述的场景,让
register
安静地休息一下,然后想出一些其他的东西,不是更好吗?假设像
static int*restrict x;
这样的东西在局部范围内被允许,对于您希望阻止别名的情况。因为
restrict
关键字的目的是假设首先要阻止别名。
typedef
extern
static
auto
register