Лучший способ построить строку из нескольких частей? - PullRequest
3 голосов
/ 28 февраля 2012

Я создаю большую программу на C ++ с множеством различных параметров времени компиляции, выбранных с помощью #define s (или параметра -D).

Я хочу иметь строку версии, которая перечисляет их количество в виде тегов, и в идеале, чтобы эта строка версии определялась как литерал, а не как константа.

В настоящее время яРассмотрим три варианта, ни один из которых не является идеальным.

  1. Сваи препроцессора определяют

    #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
    
  2. Создание константы

    const char *const REVISION=__DATE__ " " __TIME__
    #ifdef AAA
    " [A]"
    #endif
    #ifdef BBB
    " [B]"
    #endif
    // ...
    ;
    
  3. Переопределение токена

    #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) для константы времени компиляции.Третий пример, конечно, просто прямолинейный подход не работает, но это почти то, что я пытаюсь сделать.

Есть ли какой-нибудь альтернативный метод?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2012

Завершая этот вопрос комментарием, который я придерживаюсь варианта 1. Похоже, нет способа сделать то, что я надеялся сделать, поэтому несовершенство остается. Спасибо тем, кто внес свой вклад!

0 голосов
/ 28 февраля 2012
#define AAAMSG ""
#define BBBMSG ""

#ifdef AAA
    #define AAAMSG " [A]"
#endif

определите все свои пустые порции .. затем относитесь к этому как к переключателю. Если вы сохраняете типы одинаковыми, у вас не должно возникнуть проблем с переопределением ..

Примечание: я не уверен на 100%, что это работает, но изменение определения может быть сделано.

...