据我了解,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
将其作为指针传递给寄存器变量。让我感到奇怪的是
第一点似乎是无效的,因为我似乎能够传递一个指向非register
变量的指针,即使带有-pedantic-errors
GCC的标志也是如此。
那么,与没有register
关键字的声明相比,此声明有什么变化?它会改变通话习惯还是什么?
该register
关键字大多在现代C.过时的功能。它做了两两件事:
在您的情况下,它表示最好将指针本身而不是指向的数据存储在寄存器中,大概是地址/索引寄存器中。从标准C角度来看,它除了执行其他操作外,不会做其他任何事情。
当register
作为函数的一部分给出时,某个特定的编译器可能会选择某种调用约定,尽管我以前从未见过。调用约定的实践大致是这样的:“如果参数n是指针,则将其存储在索引寄存器x中,如果参数n + 1是指针,则将其存储索引寄存器y”等。
我怀疑register
这里最可能的关键字解释是程序员不知道他们在做什么。特别是因为在标题中没有留下任何评论-这相当确定地表明了自己的能力。从整个标题来看,还有许多其他迹象支持无能理论,例如这个明显的错误:#define XkbLC_BeepOnComposeFail (1<<31)
。在简短查看源代码后的几分钟内找到UB时,请远离它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句