据我所知,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 */
);
注意sym_return
是如何作为指针传递给寄存器变量的。让我好奇的是
第1点似乎是无效的,因为我似乎能够传递指向非register
变量的指针,即使有了-pedantic-errors
标志的GCC也是如此。
那么,与省略register
关键字的声明相比,这个声明有什么变化呢?它是否改变了调用约定或其他什么?
发布于 2018-06-01 16:13:10
在现代C语言中,register
关键字基本上是一个过时的功能。它做两件事:
在您的例子中,它说指针本身,而不是指向的数据,最好存储在一个寄存器中,大概是一个地址/索引寄存器。从标准C语言的角度来看,它不会做其他任何事情。
当给定register
作为函数的一部分时,某个奇特的编译器可能会选择特定的调用约定,尽管我以前从未见过这种情况。对于调用约定的实践是这样的:“如果参数n是指针,则将其存储在索引寄存器x中,如果参数n+1是指针,则将其存储在索引寄存器y中”等等。
我怀疑这里register
关键字最可能的解释是程序员不知道他们在做什么。特别是因为在标题中没有留下任何关于它的注释-这是一个相当确定的无能的迹象。从整个头部来看,还有许多其他迹象支持无能理论,比如这个明显的bug:#define XkbLC_BeepOnComposeFail (1<<31)
。当你可以在简短回顾源代码的几分钟内找到UB时,请远离它。
发布于 2018-06-01 15:34:51
这不是获取寄存器变量的地址,即它不是指向寄存器变量的指针。相反,它是在暗示指针本身(记住,指针只是变量)应该放在一个寄存器中。
https://stackoverflow.com/questions/50638269
复制相似问题