作为函数参数的"指向寄存器变量的指针"有什么作用?

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. 这似乎是允许的,尽管无法获取寄存器变量的地址,
  2. 这在某种程度上似乎很重要,可以在函数声明中提到.

点1似乎在某种程度上是无效的,因为我似乎能够将指针传递给非register变量,即使-pedantic-errors是GCC的标志.

那么,与带有省略register关键字的声明相比,这个声明有什么变化呢?它会改变召唤惯例还是什么?

Lun*_*din 7

register关键字大多在现代C.它做两件事情的已经废弃的特性:

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

在您的情况下,它表示指针本身,而不是指向的数据,应该优选地存储在寄存器中,可能是地址/索引寄存器.从标准C视图来看,除此之外没有任何其他功能.

可能是某个奇特的编译器在register作为函数的一部分给出时选择某个调用约定,尽管我以前从未见过它.用于调用约定的Praxis更像是:"如果参数n是指针,则将其存储在索引寄存器x中,如果参数n + 1是指针,则将其存储为索引寄存器y"等.

我怀疑register这里关键字最可能的解释是程序员不知道他们在做什么.特别是因为没有关于它的评论留在标题中 - 这是一个相当确定的无能的迹象.看看整个标题,还有很多其他标志支持无能论,比如这个明显的错误:#define XkbLC_BeepOnComposeFail (1<<31).如果您在短暂查看来源的几分钟内找到UB,请保持清醒.