Хотя вопрос касается способов генерирования уникальных идентификаторов строк внутри функции для целей ведения журнала, я собираюсь сделать шаг назад и посмотреть на реальную проблему, которая должна быть решена: как генерировать выходные данные журнала, которые могут легко идентифицировать строка исходного кода, не обременяя автора кода.
Давайте предположим, что вы встраиваете уникальную версию сборки в каждый выпуск вашей программы (что в целом является хорошей идеей). Предположим также, что вы используете механизм управления исходным кодом, который хранит историю вашего исходного кода (что в любом случае также является хорошей идеей) и который может предоставить вам исходный код, каким он был для любой запрошенной версии сборки. программа.
Если эти предположения верны, то решение состоит в том, чтобы ваша программа записала свою текущую версию в файл журнала. Тогда каждая отдельная запись в журнале может просто записать номер строки через __LINE__
.
Таким образом, когда кому-то нужно использовать журнал: он может посмотреть номер версии в журнале, взять соответствующий источник из репозитория управления исходным кодом и использовать номера строк из журнала, чтобы перейти к нужным исходным строкам. , Это немного увеличивает нагрузку на человека, использующего вывод журнала. Однако, если регистрируемый код зависит или зависит от другого кода, который может меняться от версии к версии, то в любом случае может потребоваться историческое состояние исходного кода.
Кроме того, преимущество работы таким способом состоит в том, что он избавляет от необходимости предполагать, что любая данная функция останется неизменной, как было изначально частью вопроса. Так что этот метод имеет гораздо более широкое применение.
Что касается реализации, вы можете либо зарегистрировать версию программы при запуске программы, либо сделать так, чтобы макрос регистрации включал ее в каждую запись.
Если версия программы обычно хранится где-то, что не легко доступно в обычном исходном коде, то вы можете создать шаг предварительной сборки, который извлечет версию и запишет ее в простой файл version.h в виде строки #define или const , Тогда регистрационный код или макрос может автоматически использовать его, чтобы всегда выводить текущую версию программы.