Использование __FILE__, __LINE__ и __FUNCTION__ в C ++

Если все ваши объекты созданы с помощью какого-то класса Factory, вы можете найти количество объектов в куче. Даже тогда вы должны иметь что-то в методе finalize(). Конечно, это не может быть сделано для всех объектов, например. классы библиотеки jdk не могут быть изменены. Но если вы хотите найти количество экземпляров определенного класса, который вы создали, вы можете найти это.

144
задан Brian Tompsett - 汤莱恩 4 June 2016 в 14:10
поделиться

4 ответа

__FUNCTION__ нестандартно, __func__ существует в C99 / C++ 11. Другие (__LINE__ и __FILE__) очень хорошо.

Это будет всегда сообщать о правильном файле и строке (и функционировать, если Вы примете решение использовать __FUNCTION__ / __func__). Оптимизация является нефактором, так как это - макрорасширение времени компиляции; это будет никогда производительность эффекта всегда.

176
ответ дан Evan Teran 4 June 2016 в 14:10
поделиться

В редких случаях может быть полезно изменить строку, которая дана __LINE__ чему-то еще. Я видел, что GNU настроить делает это, чтобы некоторые тесты сообщили о соответствующих номерах строки после того, как он ввел некоторый вуду между строками, которые не появляются в файлах первоисточника. Например:

#line 100

заставит следующие строки запуститься с __LINE__ 100. Можно дополнительно добавить новое имя файла

#line 100 "file.c"

, Это только редко полезно. Но если это необходимо, нет никаких альтернатив, о которых я знаю. На самом деле, вместо строки, макрос может использоваться также, который должен привести к любой из вышеупомянутых двух форм. Пользуясь библиотекой препроцессора повышения, можно увеличить текущую строку 50:

#line BOOST_PP_ADD(__LINE__, 50)

я думал, что полезно упомянуть это, так как Вы спросили об использовании __LINE__ и __FILE__. Каждый никогда не вытаскивает достаточно неожиданностей из C++:)

Редактирование: @Jonathan Leffler обеспечивает некоторые более хорошие примеры использования в комментариях:

Питание с #line очень полезно для препроцессоров, которые хотят сохранить ошибки сообщаемыми в коде C пользователя в соответствии с исходным файлом пользователя. Yacc, Закон, и (больше дома мне) препроцессоры ESQL/C делают это.

37
ответ дан kvantour 4 June 2016 в 14:10
поделиться

К вашему сведению: g ++ предлагает нестандартное __ PRETTY_FUNCTION __ макрос. Пока сейчас я не знал о C99 __ func __ (благодарит Evan!). Я думаю, что все еще предпочитаю __ PRETTY_FUNCTION __, когда это доступно для дополнительного обзора класса.

пз:

static string  getScopedClassMethod( string thePrettyFunction )
{
  size_t index = thePrettyFunction . find( "(" );
  if ( index == string::npos )
    return thePrettyFunction;  /* Degenerate case */

  thePrettyFunction . erase( index );

  index = thePrettyFunction . rfind( " " );
  if ( index == string::npos )
    return thePrettyFunction;  /* Degenerate case */

  thePrettyFunction . erase( 0, index + 1 );

  return thePrettyFunction;   /* The scoped class name. */
}
28
ответ дан Mr.Ree 4 June 2016 в 14:10
поделиться

Лично, я отказываюсь использовать их для чего-либо кроме сообщений отладки. Я сделал это, но я пытаюсь не показать такую информацию клиентам или конечным пользователям. Мои клиенты не являются инженерами и иногда являются не компьютерным здравым смыслом. Я мог бы зарегистрировать эту информацию к консоли, но, поскольку я сказал, неохотно за исключением сборок отладки или для внутренних инструментов. Я предполагаю, что это действительно зависит от клиентской базы, которую Вы имеете, все же.

7
ответ дан Craig S 4 June 2016 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: