C 为具有寄存器存储类的数组下标

C 为具有寄存器存储类的数组下标,c,arrays,gnu,c99,C,Arrays,Gnu,C99,在GNU c99手册中: 3.13数组下标 您可以通过指定数组的名称来访问数组元素,然后 中包含的数组下标(或索引,或元素号) 括号。下面是一个示例,假设一个名为 我的_数组: my_array[0] = 5; 数组下标表达式A[i]定义为 与表达式(*(A)+(i))相同。这意味着许多 数组名的使用等同于指针表达式它也是 表示不能为具有寄存器存储的数组下标 类 我试过下面的东西,对我来说效果很好 #include <stdio.h> int main() { r

在GNU c99手册中:

3.13数组下标

您可以通过指定数组的名称来访问数组元素,然后 中包含的数组下标(或索引,或元素号) 括号。下面是一个示例,假设一个名为 我的_数组:

my_array[0] = 5;
数组下标表达式A[i]定义为 与表达式(*(A)+(i))相同。这意味着许多 数组名的使用等同于指针表达式它也是 表示不能为具有寄存器存储的数组下标

我试过下面的东西,对我来说效果很好

#include <stdio.h>

int main()
{
        register int arr[10] = {1, [9] = 6};

        printf("arr[9] %d\n", *((arr) + 9)); // working fine
        printf("arr[9] %d\n", arr[9]); //working fine
        return 0;
}
#包括
int main()
{
寄存器int-arr[10]={1,[9]=6};
printf(“arr[9]%d\n”,*((arr)+9));//工作正常
printf(“arr[9]%d\n”,arr[9]);//工作正常
返回0;
}
有人能用粗体字解释一下这句话的意思吗?或者我尝试错误地验证它。

GCC 8.1产生:

$ gcc rega89.c
rega89.c: In function ‘main’:
rega89.c:7:9: error: address of register variable ‘arr’ requested
         printf("arr[9] %d\n", *((arr) + 9)); // working fine
         ^~~~~~
$
没有任何额外的选择。事实上,即使是GCC4.8.1也抱怨没有选择。(GCC 8.1默认为C11;GCC 4.8.1默认为C90;指定
-std=c99
-std=gnu99
没有区别。)


因此,如果您使用的是GCC,那么您必须使用比4.8.1更旧的GCC版本。或者您使用的其他编译器不像GCC那样符合标准。

假设:此语句已过时,编译器现在基本上忽略了
寄存器
,即使C标准可能不需要它,它也会生成工作代码。是的!!!我在mac上工作,它没有抛出任何错误。然而,当它在另一个系统上尝试时,它也报告了同样的情况。gcc——版本gcc(gcc)4.8.5有趣——我也在Mac上测试,但使用的是“真正的”gcc,而不是伪装成gcc的叮当声。