crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Макрос для возврата имени переменной и ее значения
RazrFalcon
  опции профиля:
сообщение 7.10.2012, 21:43
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


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

Пример работы:
int step = 24;
DEBUG(step) // "step: 24"

Можно даже с типом переменной.

Просто писать каждый раз:
qDebug() << "step:" << step;

надоедает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 8.10.2012, 7:22
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(RazrFalcon @ 7.10.2012, 22:43) *
Нужен макрос для отладки, подозреваю что такой уже существует, только не могу его нагуглить.

Пример работы:
int step = 24;
DEBUG(step) // "step: 24"

Можно даже с типом переменной.

Просто писать каждый раз:
qDebug() << "step:" << step;

надоедает...


Так можно написать свой

#define MY_DEBUG( var ) qDebug() << #var << ( var );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 8.10.2012, 16:32
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Вторые скобки необязательны:
#define MY_DEBUG( var ) qDebug() << #var << var;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.10.2012, 18:43
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(ilyabvt @ 8.10.2012, 19:32) *
Вторые скобки необязательны:


ещё как обязательны. Там может быть выражение, которое после подстановки неизвестно как впишется в тело макроса. Скобки же явно, раз и навсегда расставляют приоритет вычислений. Вообще, рекомендую ВСЕ параметры-выражения макросов использовать со скобками
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 8.10.2012, 19:43
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата(Алексей1153 @ 8.10.2012, 21:43) *
Цитата(ilyabvt @ 8.10.2012, 19:32) *
Вторые скобки необязательны:


ещё как обязательны. Там может быть выражение, которое после подстановки неизвестно как впишется в тело макроса. Скобки же явно, раз и навсегда расставляют приоритет вычислений. Вообще, рекомендую ВСЕ параметры-выражения макросов использовать со скобками


В принципе вы правы, я просто не подумал о выражениях, речь изначально шла о переменной.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 8.10.2012, 23:34
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Спасибо, то что нужно!

Сделал себе двоеточие еще:
#define MY_DEBUG( var ) qDebug().nospace() << #var << ": " << ( var );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.10.2012, 7:36
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ещё можно сшить заранее константные строки оператором макроса ##

#define MY_DEBUG( var ) qDebug().nospace() << #var##": " << ( var );


:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 9.10.2012, 15:06
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Тогда уж:
#define MY_DEBUG( var ) qDebug() << #var":" << ( var );


Так как:
#define MY_DEBUG( var ) qDebug().nospace() << #var##": " << ( var );

mainwindow.cpp:27: error: pasting formed '"lastPoint"": "', an invalid preprocessing token
    MY_DEBUG(lastPoint);
    ^
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.10.2012, 16:58
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, ## позволяет сшивать не только строки


std::string m_username;
std::string m_userlevel;
std::string m_usersex;

#define def(x,y) (m_##x##y)


def(user, name)="имя";
def(user, level)="80";
def(user, sex)="мужской";


поэтому лучше не изворачиваться, а использовать один вариант. Твой вариант - лишь для двух статических строк, которые компилятор таким образом рассматривает как одну
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 9.10.2012, 20:26
Сообщение #10


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Так мой просто компилится, а твой нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 8:07