Предположив , что ваш компилятор C ++ поддерживает их, есть ли конкретная причина не в использовании __FILE__
, __LINE__
и __FUNCTION__
для регистрации и целей отладки?
В первую очередь меня интересует предоставление пользователю вводящих в заблуждение данных - например, сообщение о неправильном номере строки или функции в результате оптимизации - или снижение производительности в результате.
В принципе, я могу доверять __FILE__
, __LINE__
и __FUNCTION__
чтобы всегда делать правильные вещи?
c++
debugging
logging
c-preprocessor
Runcible
источник
источник
Ответы:
__FUNCTION__
не является стандартным,__func__
существует в C99 / C ++ 11. Остальные (__LINE__
и__FILE__
) просто в порядке.Он всегда сообщит правильный файл и строку (и функцию, если вы решите использовать
__FUNCTION__
/__func__
). Оптимизация не является фактором, так как это расширение макроса во время компиляции; это никак не повлияет на производительность.источник
__func__
это своего рода проблема в C ++. C99 не говорит ни слова об аргументах по умолчанию и т. Д., В случаях, когда не так очевидно, как__func__
вести себя в C ++.__func__
существует в C99, а не C ++. Несмотря на это, я думаю, что разумная реализация__func__
в c ++ просто приведет к искаженному имени. Поскольку я не пишу компилятор, это не совсем мой вызов.__FUNCTION__
? Какие компиляторы кроме недавнего gcc рассматривают это как переменную, а не макрос?__func__
сейчас в стандарте C ++ 11.В редких случаях может быть полезно изменить строку, заданную
__LINE__
чем-то другим. Я видел, что GNU configure делает это для некоторых тестов, чтобы сообщать соответствующие номера строк после того, как он вставил вуду между строками, которые не отображаются в исходных исходных файлах. Например:Следующие строки будут начинаться с
__LINE__
100. При желании вы можете добавить новое имя файлаЭто редко полезно. Но если это необходимо, я не знаю альтернатив. На самом деле, вместо строки можно использовать макрос, который должен приводить к любой из двух вышеуказанных форм. Используя библиотеку препроцессора boost, вы можете увеличить текущую строку на 50:
Я думал, что это полезно упомянуть, так как вы спросили об использовании
__LINE__
и__FILE__
. Никто никогда не получает достаточно сюрпризов из C ++ :)Редактировать: @Джонатан Леффлер приводит еще несколько хороших примеров использования в комментариях:
источник
К вашему сведению: g ++ предлагает нестандартный макрос __PRETTY_FUNCTION__. До сих пор я не знал о C99 __func__ (спасибо, Эван!). Я думаю, что я все еще предпочитаю __PRETTY_FUNCTION__, когда это доступно для дополнительного определения класса.
PS:
источник
Лично я не хочу использовать их ни для чего, кроме отладки сообщений. Я сделал это, но стараюсь не показывать такую информацию клиентам или конечным пользователям. Мои клиенты не инженеры и иногда не разбираются в компьютерах. Я мог бы записать эту информацию на консоль, но, как я уже сказал, неохотно, за исключением отладочных сборок или внутренних инструментов. Полагаю, это зависит от клиентской базы, которая у вас есть.
источник
C ++ 20
std::source_location
В C ++ наконец-то добавлена опция не-макросов, и она, вероятно, будет доминировать в будущем, когда C ++ 20 станет широко распространенным:
Документация гласит:
где NTBS означает «строка байтов, завершенная нулем».
Я попробую, когда поддержка придет в GCC, GCC 9.1.0
g++-9 -std=c++2a
все еще не поддерживает его.https://en.cppreference.com/w/cpp/utility/source_location утверждает, что использование будет следующим:
Возможный вывод:
__PRETTY_FUNCTION__
против__FUNCTION__
против__func__
противstd::source_location::function_name
Ответили по адресу: В чем разница между __PRETTY_FUNCTION__, __FUNCTION__, __func__?
источник
<experimental/source_location>
в текущем gcc-9.Я использую их все время. Единственное, о чем я беспокоюсь, это выдача IP в лог-файлах. Если ваши имена функций действительно хороши, возможно, вам будет проще раскрыть коммерческую тайну. Это похоже на доставку с отладочными символами, только труднее найти вещи. В 99,999% случаев ничего плохого из этого не выйдет.
источник
strings
утилиту для извлечения всех строковых данных из исполняемого файла. Даже сжатые исполняемые файлы могут быть извлечены. Будьте очень внимательны к тому, что вы отправляете на сайт клиента. Часто конкуренты могут получить в свои руки исполняемые файлы, даже если они не должны этого делать.