Ответ 1
Обычно для основных и младших номеров версий (как 1.2, 1 является основным, а 2 - незначительным), они чаще всего записываются непосредственно в коде, обычно как #define
(потому что вам могут понадобиться их для условных компиляций, т.е. блоков #if
).
Обычно у вас есть отдельный заголовок, который содержит только те, которые определены, и ничего (кроме защиты заголовка), чтобы минимизировать зависимости.
Некоторые люди используют систему сборки (например, cmake), чтобы вытащить номер версии из управления версиями (git, svn, cvs и т.д.), а затем поместите этот номер версии в свой заголовок "версия". Или они помещают номер версии в файлы конфигурации системы сборки, а затем помещают ее в заголовок, как показано в учебнике cmake. Лично мне не нравится этот подход, потому что он слишком часто изменяет ваши файлы заголовков и вызывает частые и бессмысленные повторные компиляции.
Я предпочитаю записывать номер версии в файл заголовка, а затем вынимать эти номера версий (крупные, второстепенные,..) из заголовка в систему сборки. Это еще одна вещь, которую может легко сделать cmake.
Если вы хотите вставлять в свое программное обеспечение очень ежедневный номер версии, например номер сборки или номер версии, то вы не должны указывать его как #define
в файле заголовка, а скорее как extern const
, которую вы определяете в одном файле cpp. Например, вы можете использовать cmake, чтобы вытащить номер версии из вашей системы управления версиями, привязать ее к файлу cpp, который определяет эту переменную extern const int revision;
(через функцию cmake configure_file
), и связывать ваши программы с этим файлом cpp/object, Таким образом, номер версии встроен в ваши программы автоматически при каждой повторной сборке, и он не будет запускать полную перекомпиляцию каждый раз, когда он обновляется (что происходит при каждой фиксации).
Дело в том, что номера основных и второстепенных версий не изменяются достаточно часто, чтобы требовать какого-либо автоматического обслуживания, но вам нужно вручную записывать их только в одном месте и автоматически распространять его везде, где это может иметь значение (I рекомендовал бы, чтобы это место было самим файлом заголовка). Это только номера ревизий или сборки, которые должны быть полностью автоматизированы (сгенерированы с помощью контроля версий и автоматически распространяются везде).