寄存器存储类的范围是什么?

时间:2014-09-25 12:50:30

标签: c linux gcc

我想知道每个存储类之间的区别是什么。这里我使用了寄存器存储类。所以我很困惑,如果我们将寄存器变量声明为全局,它的范围是什么?     在我的代码中,它给出了没有为'x'指定的寄存器名称。如果有人知道它究竟在说什么以及与其他存储类相比寄存器varibale的范围是什么,请引导我?     谢谢。!!!

 below is the output of terminal using gcc compiler in Ubuntu.

 shilpi@shilpi:~/storageclass$ gcc register.c
 register.c:9:15: error: register name not specified for ‘x’
 register int x=10;
           ^
 shilpi@shilpi:~/storageclass$ gcc register.c
 register.c:9:15: error: register name not specified for ‘x’
 register int x=10;
           ^



//int x = 10 ;
int z;
int main( )
{
   extern int y ;
  // register int x ;
   printf ( "The value of x is %d \n", x ) ;
   printf ( "The value of y is %d",y ) ;
   z=add();
   printf("\nvalue of sum is : %d", z);
   return 0;

}
int y = 200 ;

int add()
{
    int sum;
    sum=x+y;
    //printf("value of sum is : %d", sum);
}

2 个答案:

答案 0 :(得分:4)

在标准C中,register仅允许在函数内部,然后是变量作为可见范围,从其声明到声明发生的块的末尾。

因此register与平台的硬件寄存器没什么关系,所以它是一个绝非。其目的是提供优化提示:不允许您获取此类变量的地址。

Gcc有一个扩展,它还允许将这些register变量与真实硬件寄存器相关联。该扩展也可以在文件范围内使用,这是您看到的错误消息。

答案 1 :(得分:0)

见标准6.9:

  

存储类说明符auto和register不会出现在   外部声明中的声明说明符。

"外部声明的定义"解释如下:

  

如5.1.1.1中所讨论的,预处理后的程序文本单位   是一个翻译单元,由一系列外部组成   声明。这些被描述为“外部”,因为它们出现了   在任何函数之外(因此具有文件范围)。

(不要与 extern 关键字混淆。)

因此您的代码无效,寄存器变量始终具有本地范围。

请注意,现在,register关键字已经过时了:在决定何时适合将变量存储在CPU寄存器中时,编译器远比程序员好。