C++ 覆盖寄存器关键字

C++ 覆盖寄存器关键字,c++,c,C++,C,记住,register是一个关键字,我们可以用它来命名函数/方法(我真的很怀念它),我们不能这样做。但我想知道,覆盖那个关键词有危险吗 #define register ... 会有任何副作用吗?登记器< /Cord>基本上是无用的。在C语言中不是。在这里,它指定您无权获取这样一个变量的地址。确保某些优化,特别是禁止该变量的任何别名,这可能很有趣。这是真的,但遗憾的是,register是一个关键字,是函数/方法的好名字。@MrAlmighty:delete和new也是一个坏主意(因为您的帖子被

记住,
register
是一个关键字,我们可以用它来命名函数/方法(我真的很怀念它),我们不能这样做。但我想知道,覆盖那个关键词有危险吗

#define register ...

会有任何副作用吗?

17.6.4.3.1[macro.names]/2

翻译单位不得定义或取消定义与关键词在词汇上相同的名称

虽然这属于

本节描述了使用C++标准库

的C++程序的限制 C表示,在
7.1.2/4

程序不得有任何名称在词汇上相同的宏 添加到当前在包含标题之前定义的关键字,或 展开标头中定义的任何宏时


所以,在C语言中,你可以把它放在
#include
s(编辑:如评论中所指出的,即使在C语言中,在你的
#define
之后使用一个来自标准库头的宏将是正式的未定义的,因为它可能会使用那个关键字)

即使它被允许和/或起作用,不要这样做。它不仅使您的程序不可读,因为
register
会被混淆(而且是非常糟糕的编码风格),而且所有
#包含
头文件的程序都会被混淆

而是使用相关名称(“寄存器”或类似名称)


尽可能避免使用宏。特别是像
MAX
MIN
这样愚蠢的宏(在某些库标题中定义)。它们让每个人都感到困惑,可能会引起严重的头痛,因为编译器不知道它们,因此您无意中使用
MAX
作为标识符会导致编译器消息混乱。

即使规范没有禁止它,如果您这样做,它仍然会破坏一些东西

以下资料来源:

#define foo register int a;

#define register static

int main()
{
    foo
    return 0;
}
使用/p开关在MSVC编译器中运行时生成此命令

#line 1 "test.cpp"

int main()
{
    static int a;
    return 0;
}

这意味着,即使您的#define遵循头中可能包含单词“register”的任何#define,由于C/C++宏扩展的发生方式,您也会破坏这些宏。

只需在所有包含之后执行即可。请注意,在本节的概述([constraints.overview])中,本节描述了使用C++标准库的设备对C++程序的限制。即使不使用标准库,我也不建议这样做,但至少是合法的。@chris的确,感谢您指出这一点(尽管“使用工具”看起来比C有更严格的限制),毕竟,只有在您避免使用包含的标题中定义的任何宏时,才允许使用
#include
s。例如,如果你使用<代码> null <代码>,你就违反了这个规则。出于这个原因和@沃尔特的答案(我认为这不是一个很好的理由),我会把它解决。但正如我之前所说,这真是一个耻辱,一个非常好的名字,我们不能使用。我做了一个关于这个关键词的研究,但我没有看到使用它的理由(我的意思是,很好),这就是为什么我觉得很遗憾,我们不能使用它,因为它已经被定义了。但是谢谢大家。“MalPalm,在C++中代码>登记器< /Cord>基本上是无用的。在C语言中不是。在这里,它指定您无权获取这样一个变量的地址。确保某些优化,特别是禁止该变量的任何别名,这可能很有趣。这是真的,但遗憾的是,
register
是一个关键字,是函数/方法的好名字。@MrAlmighty:
delete
new
也是一个坏主意(因为您的帖子被标记为
C++
)@Jongware-我不认为
delete
new
是坏主意,不是因为名字,而是因为用法。我使用的每种支持OO的语言都使用这些关键字来实例化对象。