Я создаю большую программу на C ++ с множеством различных параметров времени компиляции, выбранных с помощью #define
s (или параметра -D
).
Я хочу иметь строку версии, которая перечисляет их количество в виде тегов, и в идеале, чтобы эта строка версии определялась как литерал, а не как константа.
В настоящее время яРассмотрим три варианта, ни один из которых не является идеальным.
Сваи препроцессора определяют
#ifdef AAA
#define AAAMSG " [A]"
#else
#define AAAMSG ""
#endif
#ifdef BBB
#define BBBMSG " [B]"
#else
#define BBBMSG ""
#endif
// ...
#define REVISION __DATE__ " " __TIME__ AAAMSG BBBMSG CCCMSG DDDMSG
Создание константы
const char *const REVISION=__DATE__ " " __TIME__
#ifdef AAA
" [A]"
#endif
#ifdef BBB
" [B]"
#endif
// ...
;
Переопределение токена
#define REVISION __DATE__ " " __TIME__
#ifdef AAA
#define REVISION REVISION " [A]"
#endif
#ifdef BBB
#define REVISION REVISION " [B]"
#endif
// ...
Первый невероятно многословен (представьте, что с полдюжины независимых элементов) и подвержен ошибкам.Второй вариант намного лучше, но он создает константу вместо литерала, поэтому я не могу использовать ее как часть другой строки - пример:
send(sock,"rev " REVISION "\n",sizeof(REVISION)+4,0);
Кажется глупым использовать строку времени выполненияманипулирование (sprintf или somesuch) для константы времени компиляции.Третий пример, конечно, просто прямолинейный подход не работает, но это почти то, что я пытаюсь сделать.
Есть ли какой-нибудь альтернативный метод?