Отражение в Qt / C ++ - PullRequest
       37

Отражение в Qt / C ++

0 голосов
/ 31 марта 2011

Я только начал с Qt и обнаружил, что QMetaObject, на мой взгляд, очень приятный / удобный.

Теперь мне стало интересно, можно ли получить такую ​​информацию, как имя текущей функции, имя вызывающей функции или текущий стек с помощью Qt / standard C ++ или любой другой библиотеки C ++.

Мне это нужно для отладки / ведения журнала.

Например, в C # вы можете вызвать MethodBase.GetCurrentMethod(), чтобы получить текущий метод. Примерно так было бы очень удобно.

Ответы [ 4 ]

3 голосов
/ 31 марта 2011

Существует макрос PRETTY_FUNCTION , который возвращает хорошее отформатированное имя функции.Он доступен в GCC и, возможно, в некоторых других компиляторах.

1 голос
/ 31 марта 2011

Нет независимого от платформы способа сделать это. К сожалению (или, к счастью, в зависимости от вашей точки зрения) стандартный C / C ++ не включает такого рода интроспективные возможности.

Ниже обсуждаются различные методы получения трассировки стека и в других местах SO.

Как получить трассировку стека в C?

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

Если вы действительно хотите знать стек для записи журнала в Windows без установленной символической информации, тогда вы можете написать небольшой мини-файл дампа (MiniDumpWriteDump). Это можно сохранить в системе заказчика без символов, а затем проанализировать в системе разработчика с помощью символа .pdb для этой сборки. Это также покажет значения локальной переменной и, при желании, вы можете включить все данные процесса (что делает файлы мини-дампов огромными). Более подробная информация ниже и в других местах на сайте.

http://blogs.msdn.com/b/joshpoley/archive/2008/05/19/prolific-usage-of-minidumpwritedump-automating-crash-dump-analysis-part-0.aspx

1 голос
/ 31 марта 2011

Не думаю, что вы можете сделать это в C ++.Я думаю, что вы хотите сделать, это создать макрос ведения журнала, который использует предопределенные макросы 1002 *:

__FUNCTION__ __LINE__ __FILE__
0 голосов
/ 31 марта 2011

Вы можете включить RTTI в вашем компиляторе, если вы абсолютно хотите делать подобные вещи (и ваш компилятор поддерживает это). Но в оригинальном проекте стандарта C ++ (до 98) не определены «метаданные» во время выполнения.

http://en.wikipedia.org/wiki/Run-time_type_information

Если это чисто для регистрации, используйте макросы, определенные вашим компилятором (например, FILE и LINE ). Если вы хотите делать более сложные вещи во время выполнения, я думаю, что создание вашей собственной системы «метаданных» может быть лучшим планом (или поиск существующей в сети).

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