gpt4 book ai didi

c++ - 只要不包含单个标题,重新定义 C++ 关键字是否合法?

转载 作者:行者123 更新时间:2023-12-03 19:30:54 25 4
gpt4 key购买 nike

考虑这个代码:

#define private public

struct Test {
private:
int s{9};
};

int main() { }

我已经过了 thisthis .我没有在这里包含单个标题。这是否意味着程序的行为定义良好,还是仍然根据 C++ 标准定义?

最佳答案

尽管它肯定会“工作”并且您几乎可以保证不会调用“真正的”UB,但我认为就标准而言,根据冗长且有些模棱两可的内容,可能会争论调用了未定义的行为[lex]的详细说明.

同样,做类似 #define __included_foo_h 的事情也没有“真正的伤害”。或 struct bar { int _Data; }; ,但标准在 [lex.name] 中明确说明这些名称是保留的。无论喜欢与否,这就是它的本质。

不管它值多少钱,标准库都使用像 __data 这样的名字。或 __begin一直以来,所以显然没有不这样做的硬技术理由。只是……标准库是实现的一部分,而您的程序没有这种自由。所以,是的,这可能根本无关紧要,但您仍然不允许这样做(如果没有其他原因,除了担心您可能会在非常不明显、无法调试的情况下破坏标准库功能)方式)。

特别是:

[lex.key]
The identifiers shown in Table 5 are reserved for use as keywords (that is, they are unconditionally treated as keywords in phase 7) except in an attribute-token

[lex.phases]
7.White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.



确实,在第 4 阶段,会发生宏替换,因此第 7 阶段不会“看到”重新定义的关键字。尽管如此,它仍然清楚地表示“保留”和“无条件”。因此,如果您被允许基于“但编译器没有看到它”而忽略它,那么您不妨例如 #define __inline inline [[gnu:always_inline]]用同样的逻辑。谁在乎双下划线是否保留,编译器看不到!

我不认为,虽然它肯定会“工作”,但这是一个严格合法的观点。

(有趣的事实:我自己用过一次 #define private public,效果很好。)

关于c++ - 只要不包含单个标题,重新定义 C++ 关键字是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58777760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com