只要我不包含一个标题,重新定义C++关键字合法吗
Is it legal to redefine C++ keywords, as long as I do not include a single header?
考虑以下代码:
#define private public
struct Test {
private:
int s{9};
};
int main() { }
我已经经历了这个和这个。我这里没有包括一个标题。这是否意味着程序的行为已经被很好地定义,或者它仍然是根据C++标准定义的?
尽管它肯定会"起作用",而且你几乎可以保证不会调用"真正的"UB,但我认为,根据[lex]
的冗长且有点模糊的阐述,从标准的字母来看,可以认为调用了Undefined Behavior。
类似地,做#define __included_foo_h
或struct bar { int _Data; };
这样的事情并没有"真正的伤害",但标准在[lex.name]
中明确规定这些名称是保留的。不管你喜不喜欢,它就是这样。
不管它值多少钱,标准库总是使用__data
或__begin
这样的名称,所以显然没有硬性的技术理由不这样做。只是。。。标准库是实现的一部分,您的程序没有这种自由。所以,是的,这可能根本不重要,但你仍然不被允许这样做(如果没有其他原因,只是担心你可能会以一种非常不明显、不可能调试的方式破坏标准库功能(。
特别是:
[lex.key]
表5中显示的标识符被保留用作关键字(也就是说,它们在第7阶段被无条件视为关键字(,属性令牌除外[lex.phase]
7.分隔标记的空白字符不再重要。每个预处理令牌都被转换为一个令牌。由此产生的标记被语法和语义分析,并被翻译为一个翻译单元。
True,在第4阶段,会发生宏替换,因此第7阶段不会"看到"重新定义的关键字。尽管如此,它明确表示"保留"answers"无条件"。因此,如果允许您基于"但编译器看不到"忽略这一点,那么您也可以使用相同的逻辑,例如#define __inline inline [[gnu:always_inline]]
。谁在乎是否保留了双下划线,编译器看不到!
我不认为,尽管它肯定会"奏效",但这是一个严格合法的观点。
(有趣的事实:我自己也用过#define private public
一次,效果很好。(
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类