Использование переменной внутри макроса в C ++ - PullRequest
1 голос
/ 12 апреля 2019

Я столкнулся со следующим макросом, и я не могу понять, что именно он делает;

#include <iostream>
#define TEST(a1) \
  int a1 = 5; 

int main(){

   TEST(a1);
   std::cout << a1  << std::endl;

   return 0;
}

Он компилирует и печатает 5.

В некоторой степени я знаю макросы, но яне могу обернуть голову вокруг того, что здесь происходит.Для меня TEST выглядит как функция, которая переопределяет свой аргумент a1?

1 Ответ

2 голосов
/ 12 апреля 2019

Макрос просто помещает код, определенный в макросе, куда бы вы ни вызывали макрос через препроцессор

Что в основном сводится к тому, что этот код:

#include <iostream>
#define TEST(a1) \
  int a1 = 5; 

int main(){

   TEST(a1);
   std::cout << a1  << std::endl;

   return 0;
}

становится этим кодом:

#include <iostream>

int main(){

   int a1 = 5; 
   std::cout << a1  << std::endl;

   return 0;
}

в действии.

Преимущество макроса в том, что вы можете использовать его несколько раз. И, поскольку наш пример параметризован, мы можем использовать его с небольшими изменениями. Так, например, этот код:

#include <iostream>
#define TEST(a1) \
  int a1 = 5; 

int main(){

   TEST(a1);
   std::cout << a1  << std::endl;

   TEST(a2);
   std::cout << a2  << std::endl;

   TEST(a3);
   std::cout << a3  << std::endl;

   return 0;
}

становится:

#include <iostream>

int main(){

   int a1 = 5; 
   std::cout << a1  << std::endl;

   int a2 = 5; 
   std::cout << a2  << std::endl;

   int a3 = 5; 
   std::cout << a3  << std::endl;

   return 0;
}

Есть много вещей, которые вы можете делать с макросами, и я рекомендую вам изучить их, но это поможет вам начать.

РЕДАКТИРОВАТЬ: Также стоит отметить, что, если вы хотите, вы можете изменить этот макрос на:

#define TEST(a1,val) \
  int a1 = val; 

Таким образом, вы можете контролировать значение инициализации независимо, если хотите. Итак:

TEST(a4,8)

становится:

int a4 = 8;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...