"pointer to register variable" 作为函数参数有什么作用?

What does "pointer to register variable" as function parameter do?

据我了解,register 说明符提示编译器将变量存储在寄存器中。这一切都很好,直到我在 Xorg-7.7 的 XKBlib.h 中遇到以下声明:

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 变量,即使 GCC 有 -pedantic-errors 标志。

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

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

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

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

在你的情况下,它说指针 本身 ,而不是 pointed-at 数据,最好存储在寄存器中,大概是 address/index登记。从标准的 C 视图来看,它不会做任何其他事情。

可能是某些奇异的编译器在给定 register 作为函数的一部分时选择了某种调用约定,尽管我以前从未见过。调用约定的实践类似于:"if parameter n is a pointer, store it in index register x, if parameter n+1 is a pointer, store it index register y" 等。

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