在这个关于bool和1的问题的评论中帮助解决正在进行的辩论:
符合标准的C++预处理器是否允许#define用户重新定义语言关键字?如果是这样,符合标准的C++预处理器是否允许这样做?
如果C++程序重新定义了一个语言关键字,那么该程序本身是否符合标准?
这个问题来自于这个问题:命名循环成语:危险吗?.对于那些不想阅读原始问题的人来说,这是关于做这样的事情:
named(label1) for(int i = 0 ; i < 10 ; i++) {
for(int j = 0 ; j < 10 ; j++) {
if(some_condition)
break(label1); // exit outer loop
}
}
Run Code Online (Sandbox Code Playgroud)
这个新问题是关于"命名循环"习语的改进版本.如果你懒得阅读这篇文章,你可以直接转到这篇文章的"例子"部分,清楚地了解我在说什么.
不幸的是,这个问题很快就结束了(后来又被重新开放)因为它更像是一个利弊辩论,而不是一个纯粹的技术问题.它似乎不符合SO Q&A格式.而且,我提出的代码有几个缺陷:
break由宏重新定义它使一些可怕的东西可编译(至少使用MSVC):
int foo() {
named(label1) for(int i = 0 ; i < 10; i++)
{
if(some_condition)
{
break(label1); // here it's ok, the behavior is obvious
}
}
break(label1); // it compiles fine without warning... but the …Run Code Online (Sandbox Code Playgroud)