在C++中定义一个'for'循环宏

use*_*501 7 c++ loops for-loop c-preprocessor

也许它不是很好的编程实践,但可以定义for循环宏吗?

例如,

#define loop(n) for(int ii = 0; ii < n; ++ ii)
Run Code Online (Sandbox Code Playgroud)

效果很好,但不能让你改变变量名ii.

它可以用于:

loop(5)
{
    cout << "hi" << " " << "the value of ii is:" << " " << ii << endl;
}
Run Code Online (Sandbox Code Playgroud)

但是没有名称/符号的选择ii.

可以这样做吗?

loop(symbol_name, n)
Run Code Online (Sandbox Code Playgroud)

程序员将符号名称插入" symbol_name".

用法示例:

loop(x, 10)
{
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

pra*_*mus 28

#define loop(x,n) for(int x = 0; x < n; ++x)
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 13

在今天的C++中,我们不会使用宏,但我们使用模板和仿函数(包括lambda):

template<typename FUNCTION>
inline void loop(int n, FUNCTION f) {
  for (int i = 0; i < n; ++i) {
    f(i);
  }
}
// ...
loop(5, [](int jj) { std::cout << "This is iteration #" << jj << std::endl; } );
Run Code Online (Sandbox Code Playgroud)

loop函数在i内部使用变量,但lambda没有看到.这是内部的loop.相反,lambda定义了一个参数jj并使用该名称.

除了lambda之外,您还可以传递任何函数,只要它接受单个整数参数即可.你甚至可以传递std::to_string<int>- 不会loop对结果字符串做一些有用的事情,但语法允许它.

  • @chuckleplant:Typesafe,正确解析,没有名称泄漏. (6认同)
  • 您能否扩展您的答案:为什么这比预处理器定义更好?如果意图只是迭代 N 次? (2认同)

Art*_*amz 6

#define loop(x, n) for(int x = 0; x < n; ++ x)
Run Code Online (Sandbox Code Playgroud)

像这样的东西

#include <iostream>
using namespace std;

#define loop(x, n) for(int x = 0; x < n; ++ x)

int main() {

    loop(i, 10)
    {
        cout << i << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)