Как передать counter is for loop внутрь макроса?
Будет подставлено ИМЯ ПЕРЕМЕННОЙ b, а чему она равна — это уже другой вопрос. Никаких проблем не должно быть.#include <iostream>

#define CHECK(a,b) \
   if ((a) == (b))     \
      std::cout << "Equal" << std::endl;  \
      else std::cout << "Inequal" << std::endl;

int main()
{
    for (int i = 0; i < 5; ++i) {
        CHECK (i, 2)
    }
    return 0;
}
После препроцессирования программа превратится вот во что…int main()
{
    for (int i = 0; i < 5; ++i) {
        if ((i) == (2))
           std::cout << "Equal" << std::endl;
           else std::cout << "Inequal" << std::endl;
    }
    return 0;
}
Вывод в консолиInequal
Inequal
Equal
Inequal
Inequal
Разумеется, нехороши ситуации, когда в макрос подставляется код с побочными эффектами, но это другой вопрос.
Обычно используется примерно такое решение:#include <iostream>

#define CHECK_EQ(a, b) \
  do{ \
  if ((a) != (b)){    \
    std::cout << "Values are not equal: \"" << a << "\" != \"" << b << "\"" << std::endl \
    << "\tleft expression: \"" << #a << "\"\n\tright expression: \"" << #b << "\""  << std::endl  \
    << "\tin \"" << __FILE__ << ":" << __LINE__ << "\"" <<std::endl; \
  } \
  }while(0)
 // while(0) для того, чтобы поставить ; после макроса.
 
int main()
{
  int a = 1;
  for(int i = 0; i < 3; ++i){
      CHECK_EQ(a + 1, i);
  }
}
Вывод:Values are not equal: "2" != "0"
	left expression: "a + 1"
	right expression: "i"
	in "<...>:17"
Values are not equal: "2" != "1"
	left expression: "a + 1"
	right expression: "i"
	in "<...>:17"