考虑到register
是一个关键字,我们可以用来命名函数/方法(我真的很想念它),我们不能这样做。但我想知道,覆盖该关键字是否危险?
#define register ...
会出现任何副作用吗?
答案 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
你的头文件的所有程序!
而是使用相关名称('注册'或类似名称)。
尽可能避免使用宏。特别是像MAX
或MIN
这样的愚蠢宏(在某些库头文件中定义)。它们会使每个人感到困惑,并且会引起严重的麻烦,因为编译器并不了解它们,因此您无意中使用MAX
作为标识符会导致令人困惑的编译器消息。