不,这几乎肯定会导致未定义的行为。
来自n4296 17.6.4.3.1 [macro.names] /2:(通过下面的@james)
翻译单元不得#define 或#undef 名称在词法上与关键字、表 2 中列出的标识符或 7.6 中描述的属性标记相同。
private 和 public 是关键字。只需在其中一个上执行#define 就是未定义的行为如果您使用 C++ 标准库中的任何内容:
17.6.4.1/1 [constraints.overview]
本节描述了对使用 C++ 标准库设施的 C++ 程序的限制。
如果不这样做,则 17.6.4.3.1 中的限制似乎不适用。
可能导致违规的另一种方式是,如果您使用具有两个不同定义的相同结构。尽管除了public 和private 之外,大多数实现可能并不关心这两个结构是否相同,但标准并没有做出这样的保证。
尽管如此,最常见的 UB 是“它可以工作”,因为很少有编译器关心。
但这并不意味着它是“安全的”。在特定的编译器中它可能是安全的(检查所述编译器的文档:但是,这将是一个奇怪的保证!)。如果您通过两个不同的定义访问相同的结构,例如,即使其他错误的可能性更小,很少有编译器(如果有的话)会提供上述工作所需的布局保证(和修饰保证)。
许多编译器将“正常工作”。这并不保证安全:下一个编译器版本可能会进行无数更改,并以难以(或容易)检测的方式破坏您的代码。
只有在收益很大时才做这样的事情。
如果您从不包含任何标准库头文件并且不使用它在两个编译单元中进行不同的定义,我无法找到#defineing 关键字是未定义行为的证据。所以在一个高度受限的程序中,它可能是合法的。在实践中,即使它是合法的,它仍然不是“安全的”,因为这种合法性非常脆弱,而且编译器不太可能针对这种语言滥用进行测试,或者关心它是否会导致错误。
#define private foo 引起的未定义行为似乎并不局限于在std 标头的#include 之前执行此操作,例如它是多么脆弱。 p>