我知道引用已注册变量的地址会导致编译错误.
int main()
{
register int i = 10;
int *a = &i;
printf("%d", *a);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,gcc由于引用了已注册变量的地址,因此在使用时会出现编译错误i.
那么下面的代码,它做了类似的事情,怎么会导致没有错误呢?
#include<stdio.h>
int *NEXT(register int i)
{
int *ipt;
ipt = &i;
ipt++;
return ipt;
}
main ()
{
int j=2;
printf("%d",(NEXT(j)));
}
Run Code Online (Sandbox Code Playgroud)
编辑:我的gcc版本
i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2335.15.00)版权所有(C)2007 Free Software Foundation,Inc.这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.
如果您的报告是准确的,这可能是由于编译器中的错误,或者可能是您的编译器不符合标准C的宽松编译模式.
根据C 2011 5.1.1.3,C实现必须在违反约束时生成诊断.根据6.5.3.2,一个约束是&必须没有用寄存器声明操作数.因此,在这种情况下,符合标准的编译器不能自由地忽略错误; 它必须产生诊断.