@Zellily

Как передать counter is for loop внутрь макроса?

Скажем, есть макрос, который проверяет а==b и печатает сообщение, если а!=b. При этом макрос подставляет значения a и b для печати. Но если b - это conter из цикла, то значения 0, 1, 2, 3... конечно, не подставятся, а подставится тупо b.

Можно ли как-нибудь это обойти?
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Будет подставлено ИМЯ ПЕРЕМЕННОЙ 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


Разумеется, нехороши ситуации, когда в макрос подставляется код с побочными эффектами, но это другой вопрос.
Ответ написан
@Ariox41
Обычно используется примерно такое решение:
#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"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы