Rus*_*lan 2 c function calling-convention function-declaration register-keyword
据我所知,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
关键字的声明相比,这个声明有什么变化呢?它会改变召唤惯例还是什么?
该register
关键字大多在现代C.它做两件事情的已经废弃的特性:
在您的情况下,它表示指针本身,而不是指向的数据,应该优选地存储在寄存器中,可能是地址/索引寄存器.从标准C视图来看,除此之外没有任何其他功能.
可能是某个奇特的编译器在register
作为函数的一部分给出时选择某个调用约定,尽管我以前从未见过它.用于调用约定的Praxis更像是:"如果参数n是指针,则将其存储在索引寄存器x中,如果参数n + 1是指针,则将其存储为索引寄存器y"等.
我怀疑register
这里关键字最可能的解释是程序员不知道他们在做什么.特别是因为没有关于它的评论留在标题中 - 这是一个相当确定的无能的迹象.看看整个标题,还有很多其他标志支持无能论,比如这个明显的错误:#define XkbLC_BeepOnComposeFail (1<<31)
.如果您在短暂查看来源的几分钟内找到UB,请保持清醒.