为什么编译器不会为获取寄存器操作数的地址发出诊断信息?

aas*_*tic -2 c

我知道引用已注册变量的地址会导致编译错误.

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.这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

Eri*_*hil 9

如果您的报告是准确的,这可能是由于编译器中的错误,或者可能是您的编译器不符合标准C的宽松编译模式.

根据C 2011 5.1.1.3,C实现必须在违反约束时生成诊断.根据6.5.3.2,一个约束是&必须没有用寄存器声明操作数.因此,在这种情况下,符合标准的编译器不能自由地忽略错误; 它必须产生诊断.