覆盖register关键字

Overwrite register keyword

本文关键字:关键字 register 覆盖      更新时间:2023-10-16

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

#define register ...

会有什么副作用吗?

C++说,在17.6.4.3.1[macro.names]/2

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

尽管这属于

本节介绍对使用C++标准库设施的C++程序的限制

C说,在7.1.2/4

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

因此,在C中,您可以将其放在所有#include之后(编辑:正如注释中所指出的,即使在C中也一样,在#define之后使用来自标准库头的宏将是正式未定义的,因为它可能使用了该关键字)

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

以下来源:

#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在标头中的任何#define后面,这些#define可能在其展开中包含单词"register",但由于C/C++宏展开的方式,您也会破坏这些宏。

即使这是允许的和/或有效的,也不要这样做。它不仅会让你的程序无法读取,因为register会被混淆(而且是非常糟糕的编码风格),而且会让所有#include成为你的头文件的程序都无法读取!

请使用相关名称("注册"或类似名称)。

尽可能避免使用宏。特别是像MAXMIN这样愚蠢的宏(它们在一些库头中定义)。它们混淆了所有人,可能会引起严重的头痛,因为编译器不知道它们,所以您无意中将MAX用作标识符会导致编译器消息混乱。