当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《c-使用寄存器和静态存储类声明变量》经验,为你挑选了2个好方法。

(ANSI-C 89)嗨,是否可以将变量声明为静态寄存器?当我尝试这样做时,我只是按摩错误:multiple storage classes in declaration specifiers

这是代码:

#include 

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);
}



1> Iharob Al As..:

两个registerstatic是存储类说明符,和至多一个存储类说明可以被指定.

从C11标准ISO/IEC 9899:2011:

6.7.1存储类说明符

句法

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

约束

    最多可以在声明中的声明说明符中给出一个存储类说明符,但_Thread_local可以使用static或出现extern.120)


120)参见''未来语言方向''(6.11.5).



2> Kerrek SB..:

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

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

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

static:内部联动,静态存储持续时间

extern:外部链接,静态存储持续时间

auto,register:无联动,自动存储持续时间.仅允许在块范围内.

none:在块范围内auto,与文件范围相同extern.

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

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

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有