我想定义私有和受公共保护。
#define private public
#define protected public
这在 C++ 中安全吗?
不,这几乎肯定会导致未定义的行为。
From n429617.6.4.3.1 [macro.names] /2:(来自下面的@james)
翻译单位不得#define
or #undef
名称在词法上与关键字、表 2 中列出的标识符或 7.6 中描述的属性标记相同。
private
and public
是关键词。只需做一个#define
其中之一是未定义的行为if您可以使用 C++ 标准库中的任何内容:
17.6.4.1/1 [约束.概述]
本节介绍对使用 C++ 标准库功能的 C++ 程序的限制。
如果不这样做,则 17.6.4.3.1 中的限制似乎不适用。
另一种可能导致违规的方式是,如果您使用具有两个不同定义的相同结构。虽然大多数实现可能不关心这两个结构是否相同,除了public
vs private
,该标准不做出这种保证。
尽管如此,最常见的 UB 类型是“它有效”,很少有编译器关心。
但这并不意味着它是“安全的”。在特定的编译器中它可能是安全的(检查所述编译器的文档:然而,这将是一个奇怪的保证!)。例如,如果您通过两个不同的定义访问相同的结构,则很少有编译器(如果有)会提供上述显式工作所需的布局保证(和修改保证),即使其他错误的可能性更小。
许多编译器都会“正常工作”。这并不意味着它是安全的:下一个编译器版本可能会做出无数的更改之一,并以难以(或容易)检测到的方式破坏您的代码。
只有当回报很大时才做这样的事情。
我找不到证据表明#define
如果您从不包含任何标准库头并且不使用它在两个编译单元中进行不同的定义,则使用关键字是未定义的行为。所以在严格限制的程序中,它可能是合法的。在实践中,即使它合法,它仍然不“安全”,既因为合法性极其脆弱,又因为编译器不太可能针对这种语言滥用进行测试,或者关心它是否会导致错误。
由以下原因引起的未定义行为#define private foo
似乎不限于这样做before the #include
of the std
标头,作为其脆弱程度的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)