覆盖register关键字
Overwrite register keyword
考虑到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
成为你的头文件的程序都无法读取!
请使用相关名称("注册"或类似名称)。
尽可能避免使用宏。特别是像MAX
或MIN
这样愚蠢的宏(它们在一些库头中定义)。它们混淆了所有人,可能会引起严重的头痛,因为编译器不知道它们,所以您无意中将MAX
用作标识符会导致编译器消息混乱。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 替换不推荐使用的register关键字C++11
- 覆盖register关键字
- 与register关键字关联的其他语义