2015-04-12 2 views
0

контекст

Я сочинительство класс отладки в Qt для проекта, и я хочу знать, в каком классе я так что теперь я пишу:Получить имя класса вызова функции

MyClass::function1() 
{ 
    DEBUG_IN("[MyClass] Enters function1()") 
    ....do something 
    DEBUG_OUT("[MyClass] Exits function1()"); 
} 

EDIT:DEBUG_IN() и DEBUG_OUT() являются глобальными функциями. Они не являются частью класса MyClass

Вопрос

Можно ли получить имя класса, в котором называется DEBUG()?

(и БАМЭ функции, где DEBUG() называется?)

, так что я мог бы просто сделать:

MyClass::function1() 
{ 
    DEBUG_IN("function1()") 
    ....do something 
    DEBUG_OUT("function1()"); 
} 

и

DEBUG_IN(QString text) 
{ 
    qDebug() << qPrintable("[") 
      << qPrintable(getClassName()) 
      << qPrintable("] Enters ") 
      << qPrintable(text); 
} 

Thx много

+0

Попробуйте посмотреть на http://stackoverflow.com/questions/1666802/is-there-a-class-macro-in-c. Если вы не знакомы с тем, как работает макрообъем, я могу попытаться прояснить это для вас. – Qartar

+0

@qartar: Ты дал мне тот же ответ, что и два других предложения, однако я DEBUG() не является частью MyClass (я только что редактировал вопрос, потому что он был недостаточно ясен) – ochurlaud

+0

Вы можете передать расширенный макрос непосредственно на функция. например 'DEBUG_IN (__ PRETTY_FUNCTION__, ...)' – Qartar

ответ

2

Действительно есть.

typeid(*this).name() 

Дает вам читаемое имя класса. Не указано, как это имя сконструировано, поэтому ваш компилятор может не указывать точное имя класса, но он должен быть хорош для целей отладки.

Поскольку DEBUG_IN и DEBUG_OUT являются бесплатными функциями, вам необходимо передать тип класса в качестве аргумента. Простой шаблон должен сделать трюк

template<typename CLASSNAME> 
void DEBUG_IN(QString msg, CLASSNAME* that) 
{ 
    ... typeid(*that).name() 

} 
+0

Проблема в том, что она дает мне только то, что я в DEBUG_IN, но не класс, из которого вызывается DEBUG_IN.Я только что отредактировал свой вопрос, потому что это было непонятно, кажется, – ochurlaud

+0

, как бы вы использовали DEBUG_IN()? Вам всегда нужно добавлять параметр 'this' в параметр, не так ли? – ochurlaud

+0

@ochurlaud Yep. –

2

Ближайшим к тому, что вы хотите, будет __PRETTY_FUNCTION__. Это включает в себя полное имя функции и подпись.

Edit:

Вы должны использовать его как это:

#define DEBUG_IN_PRETTY(...) DEBUG_IN(__PRETTY_FUNCTION__, __VA_ARGS__) 

затем вызвать DEBUG_IN_PRETTY (очевидно DEBUG_IN потребности взять дополнительный аргумент). Это расширит макрос на сайте вызова.

+0

проблема в том, что она дает мне только то, что я в DEBUG_IN, но не класс, из которого вызывается DEBUG_IN. См. Мой Редактировать – ochurlaud

+0

Можете ли вы изменить определения функций DEBUG_ *? –

+0

@CaptainGiraffe Да, я могу. Идея? Иначе я мог бы просто скопировать пасту всюду DEBUG (typeid (* this) .name(), "function1()"), но я надеюсь получить больше времени :) – ochurlaud

Смежные вопросы