首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“指向寄存器变量的指针”作为函数参数有什么作用?

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

Stack Overflow用户
提问于 2018-06-01 15:31:15
回答 2查看 525关注 0票数 2

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

代码语言:javascript
复制
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-errors标志的GCC也是如此。

那么,与省略register关键字的声明相比,这个声明有什么变化呢?它是否改变了调用约定或其他什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-01 16:13:10

在现代C语言中,register关键字基本上是一个过时的功能。它做两件事:

  • 告诉编译器,如果可能的话,它应该尝试将变量存储在CPU寄存器中。现在,编译器比程序员更适合进行这样的调用,因此使程序员不再需要接受变量的地址。

在您的例子中,它说指针本身,而不是指向的数据,最好存储在一个寄存器中,大概是一个地址/索引寄存器。从标准C语言的角度来看,它不会做其他任何事情。

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

我怀疑这里register关键字最可能的解释是程序员不知道他们在做什么。特别是因为在标题中没有留下任何关于它的注释-这是一个相当确定的无能的迹象。从整个头部来看,还有许多其他迹象支持无能理论,比如这个明显的bug:#define XkbLC_BeepOnComposeFail (1<<31)。当你可以在简短回顾源代码的几分钟内找到UB时,请远离它。

票数 7
EN

Stack Overflow用户

发布于 2018-06-01 15:34:51

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50638269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档