我在C ++程序中找到了一段代码,似乎for()
该程序的每个循环都循环两次,但是为什么在这样的预处理器定义中需要三分之一呢?
#define for for(int z=0;z<2;++z)for
替换for
为for(int z=0;z<2;++z)for
。显然,那会变成
for (int i = 0; i < N; ++i) {
// ...
}
进入
for (int z=0;z<2;++z) for (int i = 0; i < N; ++i) {
// ...
}
因此创建了两个嵌套循环。没有这些额外的for
东西
for (int z=0;z<2;++z) (int i = 0; i < N; ++i) {
// ...
}
这显然是不正确的。
请注意,即使按照您在问题中提供的形式是“正确的”,也并不意味着这是“良好的实践”。这是过度使用宏的例子,必须避免。这是它可能会出错的众多示例之一:
for (int z = 0; z < 5; ++z) {
for (int i = 0; i < 3; ++i) {
std::cout << z << std::endl; // this will never print 2, 3, 4
}
}
这将扩展为
for (int z=0;z<2;++z) for (int z = 0; z < 5; ++z) {
for (int z=0;z<2;++z) for (int i = 0; i < 3; ++i) {
std::cout << z << std::endl; // this will never print 2, 3, 4
}
}
这意味着您现在有四个嵌套循环,并且内部循环将打印“不可见”,z
而不是z
您在外部循环中声明的内容(在扩展代码中成为第二级循环)。
另一个原因:@stefan指出,使用关键字或其他众所周知的标识符作为宏名称是一个非常糟糕的主意。让人觉得臭名昭著#define true false
。而且,正如@HolyBlackCat所提到的,它也是未定义的行为,这意味着就该标准而言,任何事情都可能发生。从“看似有效”的代码到与火星人(入侵地球以从丑陋的代码中清除地球)的全面的第三次世界大战。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句