2

(ANSI-C 89)嗨,是否可以同时声明一个变量staticregister?每当我尝试这样做时,我都会得到一个错误消息:multiple storage classes in declaration specifiers

这是代码:

#include <stdio.h>

void f1(static int i);
int main()
{
    static register int i;

    i = 5;
    f1(i);
}

void f1(static int i)
{
    static int y =6;
    y+=1;
    printf("\n Y=%d \n",y);
}

4

3 回答 3

9

register和都是static存储类说明符,最多可以指定一个存储类说明符。

根据 C11 标准 ISO/IEC 9899:2011:

6.7.1 存储类说明符

句法

  1.      存储类说明符:
              typedef
              extern
              static
              _Thread_local
              auto
              register

约束

  1. 最多可以在声明中的声明说明符中给出一个存储类说明符,除非它_Thread_local可能与static或一起出现extern120)

120)见“未来语言方向”(6.11.5)。

于 2016-01-09T14:59:25.647 回答
6

C 中的每个对象都有一个存储持续时间,它恰好是以下之一:自动、静态、已分配和(从 C11 开始)线程本地。

除了分配的存储之外,对象的存储持续时间由引用该对象的声明名称的链接决定。(分配了存储的对象没有与之关联的任何名称。)标识符的链接由声明中存在的存储类说明符确定。由于一个对象只能有一种类型的链接和一个存储持续时间,因此 C 语言只允许您指定一个存储类说明符(C11 中的例外_Thread_local)。

链接和由此产生的存储期限如下:

  • static:内部联动,静态存储时长
  • extern:外部联动,静态存储时长
  • auto, register: 无联动,自动存储时长。仅允许在块范围内。
  • none:在块范围与 相同auto,在文件范围与extern.

如您所见,几乎任何两个存储类说明符都会导致不同的、不兼容的语义。因此,该语言简单地禁止使用多个存储类说明符,因为对于大多数组合,并不清楚请求了哪种行为。似乎autoandregister是仅有的两个可以一起应用的说明符。C11 实际上添加了可能与or_Thread_local一起出现的异常,从而导致后者与线程本地存储持续时间的联系。externstatic

不同的存储持续时间和链接可能需要不同的实现。由于没有链接的变量在每个范围内都必须是唯一的,因此它们通常会放在函数调用堆栈上(如果需要存储的话)。相比之下,具有静态存储持续时间的变量需要在整个程序的持续时间内持续存在,因此不能放在调用堆栈上,而是需要进入整个可用的内存的其他部分。

于 2016-01-09T16:45:19.037 回答
-2

您将无法做到这一点,因为静态变量存储在.bss内存区域中,但寄存器存储在高速 CPU 寄存器中。

https://en.wikipedia.org/wiki/.bss

于 2016-01-09T15:01:07.490 回答