c - 使用寄存器和静态存储类声明变量

时间:2016-01-09 14:57:01

标签: c gcc static c89 register-allocation

(ANSI-C 89) 嗨,是否可以声明变量静态注册?当我尝试这样做时,我只是按摩错误: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);
}

3 个答案:

答案 0 :(得分:6)

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

来自C11标准ISO / IEC 9899:2011:

  

6.7.1存储类说明符

     

<强>语法

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

    <强>约束

         
        
    1. 最多可以在声明中的声明说明符中给出一个存储类说明符,但_Thread_localstatic可能会显示extern 120)< / SUP>
    2.               

      120) 参见''future language directions''(6.11.5)。

答案 1 :(得分:5)

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

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

链接和产生的存储持续时间如下:

  • static:内部链接,静态存储持续时间
  • extern:外部链接,静态存储持续时间
  • autoregister:无链接,自动存储持续时间。仅允许在块范围内。
  • none:与auto相同的块范围,文件范围与extern相同。

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

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

答案 2 :(得分:-2)

你无法做到这一点,因为静态变量存储在function isValidURL(str) { var a = document.createElement('a'); a.href = str; return (a.host && a.host != window.location.host); } 存储区中,但寄存器存储在高速CPU寄存器中。

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