我们知道用寄存器存储类声明的变量的地址是不能取的。所以我尝试用 register 关键字创建一个数组并尝试访问元素。但我注意到编译器没有引发任何错误。
#include <stdio.h>
void main()
{
register int x[]={3,4};
printf("%d\n",x[0]); // compiled successfully
// printf("%d",&x[0]);// compiler raises an error
}
Run Code Online (Sandbox Code Playgroud)
众所周知,编译器将表达式 x[0] 转换为 *(x+0),其中 x 表示基地址。但是怎么可能得到数组的基地址,因为它是用寄存器存储类声明的?
提前致谢..
我想知道,我们如何确定用register说明符定义的变量是否存储在CPU寄存器中?
我读到gcc提供了将全局变量定义为寄存器存储变量的支持.我想知道的是标准是否有这种支持的任何规范.
据我所知,register说明符提示编译器将变量存储在寄存器中.这一切都很好,直到我XKBlib.h从Xorg-7.7中看到以下声明:
extern int XkbTranslateKeySym(
Display * /* dpy */,
register KeySym * /* sym_return */,
unsigned int /* modifiers */,
char * /* buffer */,
int /* nbytes */,
int * /* extra_rtrn */
);
Run Code Online (Sandbox Code Playgroud)
注意如何sym_return作为指向寄存器变量的指针传递.是什么让我想知道的是
点1似乎在某种程度上是无效的,因为我似乎能够将指针传递给非register变量,即使-pedantic-errors是GCC的标志.
那么,与带有省略register关键字的声明相比,这个声明有什么变化呢?它会改变召唤惯例还是什么?
c function calling-convention function-declaration register-keyword