覆盖注册关键字

时间:2014-09-17 14:28:15

标签: c++ c

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

#define register ...

会出现任何副作用吗?

3 个答案:

答案 0 :(得分:9)

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

中说
  

翻译单元不得#define或#undef名称与关键字词汇相同

虽然这属于

  

本节介绍对使用C ++标准库

的工具的C ++程序的限制

C在7.1.2/4

中说
  

程序不应该有任何名字有词汇相同的宏   在包含标题或之前定义的关键字   当标题中定义的任何宏被扩展时

所以,在C中,你可以把它放在所有#include之后(编辑:在评论中指出,即使在C中,使用来自标准库标题的宏在你的#define之后将正式未定义,因为它可能正在使用该关键字)

答案 1 :(得分:2)

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

以下来源:

#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 ++宏扩展的发生方式,你也会破坏这些宏。

答案 2 :(得分:1)

即使它被允许和/或工作,不这样做。它不仅使你的程序不可读,因为register会混淆(并且编码风格极差),但#include你的头文件的所有程序!

而是使用相关名称('注册'或类似名称)。

尽可能避免使用宏。特别是像MAXMIN这样的愚蠢宏(在某些库头文件中定义)。它们会使每个人感到困惑,并且会引起严重的麻烦,因为编译器并不了解它们,因此您无意中使用MAX作为标识符会导致令人困惑的编译器消息。