вывести имя переменной в #define - PullRequest
6 голосов
/ 14 октября 2011

Я пытаюсь распечатать на консоли с помощью макроса имя переменной для отображения значения членов при отладке (ведении журнала). Как это сделать? Я попробовал следующее, но это не работает.

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl;

int main(){
   int my_variable=3;
   MY_PRINT( my_variable );
   // I would like to print to console
   // 'my_variable'=3
}

Ответы [ 2 ]

18 голосов
/ 14 октября 2011

Ау ... Я нашел решение.

Я должен написать макрос вот так

 #define MY_PRINT(x) std::cout << #x"=" << x << std::endl
3 голосов
/ 20 октября 2013

Для C ++ я использую это:

#define STR(x) #x << '=' << x

int main()
{
  int i = 1;
  std::string str("hello");
  std::vector<std::string> vec;
  my_class mc;

  ...

  std::cout << STR(i) << std::endl
            << STR(str) << std::endl
            << STR(vec) << std::endl
            << STR(mc) << std::endl;

  return 0;
}

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

std::ostream operator<<(std::ostream&, const T&);
std::ostream operator<<(std::ostream&, const std::vector<T>&);
etc

Но мне бы хотелось, чтобы существовал шаблонный способ замены макроса или хотя бы имя переменной, предоставленное # x.

...