我得到错误:未指定'i'的注册名称

时间:2011-01-04 11:47:33

标签: c

#include <stdio.h>
register int i = 10;
int main(void)
{
    printf( " i = %d \n ", i );
    return 0;
}

这里我将变量i声明为寄存器。但是,在编译时显示以下错误

" error: register name not specified for ‘i’ "

为什么我们不应该在全局使用register关键字?

4 个答案:

答案 0 :(得分:10)

register变量是一种局部变量 这是一个提示,将值存储在寄存器中以便更快地访问 寄存器变量不能是全局的或静态的 它只能在一个块中定义 另请格式化您发布的代码

答案 1 :(得分:3)

register变量不能用作“全局”变量,因为文件范围变量具有静态存储,因此根据定义它们具有地址。 register变量恰恰相反,这些变量是程序员承诺从不接受其地址的变量。因此,将两者结合起来没什么意义。

BTW,你得到的错误信息不是很有帮助。您的编译器似乎指的是允许将register变量修复到特定硬件寄存器的扩展。如果您发布此类错误消息,请同时指出您正在使用的编译器和/或平台。

答案 2 :(得分:0)

我们之所以不应该在全局变量中使用register关键字,是因为定义为 register 存储类的变量的寿命在定义该变量的块之内。

总是可以比存储在存储器中的值更快地访问存储在CPU寄存器中的值。因此,如果在程序中的许多地方都使用了变量,则最好将其存储类声明为 register

循环变量是一个很好的例子,我们可以将它们的存储类命名为寄存器。

#include<stdio.h>
int main()
{
    register int i;
    for(i=1;i<=10;i++)
        printf("%d\n",i);
    return 0;
}

答案 3 :(得分:-3)

register的使用在大多数现代编译器上已经过时。不要使用它。

过去,编译器不够智能,无法确定最常访问哪些变量,因此应在寄存器中分配永久位置。但现代编译器使用静态单一赋值和通过着色进行寄存器分配等技术,这样编译器在知道何时变量应该在寄存器中以及何时应该“溢出”到存储器时要比你好得多。

此外,register对其变量施加了限制。你不能有一个指向register变量的指针,因为指针指向内存位置,而变量不在内存中(至少在概念上)。并且register变量必须是自动变量 - 通常称为“堆栈”变量。因此,它必须是函数中的局部变量,并且不能被限定为staticextern

简而言之,使用register从未在现代编译器中提供性能提升,但确实会给程序员带来麻烦。过早优化的最大武器 - 浪费程序员的时间与执行时间节省的错​​误承诺 - 再次罢工。