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