are*_*pau 5 c++ c-preprocessor
我在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) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
成
for (int z=0;z<2;++z) for (int i = 0; i < N; ++i) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
从而创建两个嵌套循环.如果没有那么多,for那就是
for (int z=0;z<2;++z) (int i = 0; i < N; ++i) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这显然是不正确的.
请注意,尽管您在问题中提供的表格中"正确",但这并不意味着它是"良好做法".这是过度宏观滥用的一个例子,必须予以避免.以下是它可能出错的众多例子中的一个:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这将扩展到
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
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着您现在有四个嵌套循环,并且内部循环将打印"不可见" z而不是z您在外部循环中声明的内容(它将成为扩展代码中的第二级循环).
另一个原因:正如@stefan指出的那样,使用关键字或其他众所周知的标识符作为宏名称是一个非常糟糕的主意.让人想起臭名昭着的#define true false.并且,正如@HolyBlackCat所提到的,它也是未定义的行为,这意味着就标准而言,任何事情都可能发生.从"似乎正在工作"的代码到与火星人一起全面爆发的第三次世界大战(他们邀请地球从丑陋的代码中清除它).
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |