У меня есть проект C ++, который хранится в репозитории Bazaar. Этот проект также использует #define
Строка для отображения номера версии. Кто-то только что спросил, можем ли мы просто привязать этот отображаемый номер версии к номеру ревизии репозитория bzr.
Итак, в псевдо-C, псевдо-bash, что-то вроде:
#define VERSION_STRING "revision $(bzr revno)"//...
cout << "Starting " << VERSION_STRING;
Или так. Как бы вы ответили на этот вопрос? Запускает ли make-файл сценарий, который вставляет вывод этой команды в соответствующий исходный файл? Есть ли для этого решение на макроуровне? Так далее?
Я открыт для любых умных решений, так как на этом я рисую образованный бланк. = D
Компилятор будет иметь флаг для внешнего определения значения макроса. Для g ++ и clang ++ это -D
:
g++ -DVERSION_STRING="revision $(bzr revno)" file.cpp -c -o file.o
Чтобы получить это в файле в виде строки, вы можете добавить дополнительные кавычки в определение:
g++ -DVERSION_STRING="\"revision $(bzr revno)"\" file.cpp -c -o file.o
или вам нужно знать, как преобразовать это значение в файл, что занимает немного магия:
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
Тогда вы также можете иметь значение по умолчанию. Я бы порекомендовал установить переменную, отличную от той, которую вы используете внутри, это помогает отслеживать:
#include <iostream>
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
#ifdef VERSION
#define VERSION_STRING STRINGIFY(VERSION)
#else
#define VERSION_STRING "0.0.0"#endif
int main()
{
std::cout << VERSION_STRING << '\n';
}
результаты в:
$ g++ -DVERSION="1.0.0" SO.cpp
$ ./a.out
1.0.0
$ g++ SO.cpp
$ ./a.out
0.0.0
Заметка, $(bzr revno)
это синтаксис для запуска bzr revno
и подставить его вывод в оболочке (синтаксис bash, вероятно, такой же в большинстве других). Как отметил Мусасаби, внутри make-файла синтаксис немного отличается: $(shell bzr revno)
,
Других решений пока нет …