2

据我了解,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. 尽管不可能获取寄存器变量的地址,但这似乎是允许的,
  2. 在函数声明中提到这似乎很重要。

第 1 点似乎在某种程度上无效,因为我似乎能够将指针传递给非register变量,即使使用-pedantic-errorsGCC 的标志也是如此。

register那么,与省略关键字的声明相比,此声明有何变化?它会改变调用约定还是什么?

4

2 回答 2

7

关键字在现代 C 中大多是一个过时的register特性。它做了两件事:

  • 告诉编译器如果可能,它应该尝试将变量存储在 CPU 寄存器中。如今,编译器比程序员更适合进行此类调用,因此该功能已过时。
  • 阻止程序员获取变量的地址。

在你的情况下,它说指针本身,而不是指向的数据,应该最好存储在一个寄存器中,大概是一个地址/索引寄存器。从标准的 C 视图来看,它不会做任何其他事情。

可能是某个奇异的编译器在register作为函数的一部分给出时选择了某个调用约定,尽管我以前从未见过。调用约定的实践大致是这样的:“如果参数 n 是指针,则将其存储在索引寄存器 x 中,如果参数 n+1 是指针,则将其存储在索引寄存器 y 中”等等。

我怀疑register这里对关键字最可能的解释是程序员不知道他们在做什么。特别是因为标题中没有留下任何评论 - 这是相当肯定的无能迹象。从整体上看标题,还有很多其他迹象支持无能理论,例如这个公然的错误:#define XkbLC_BeepOnComposeFail (1<<31). 如果您可以在简要查看源代码的几分钟内找到 UB,请远离它。

于 2018-06-01T08:13:09.800 回答
1

这不是获取寄存器变量的地址,即它不是指向寄存器变量的指针。相反,它暗示指针本身(请记住,指针只是变量)应该放在寄存器中。

于 2018-06-01T07:34:51.173 回答