Отключение кода C ++ без макросов - PullRequest
2 голосов
/ 25 апреля 2011

Я ненавижу макросы. Я стараюсь не использовать их как можно чаще, но иногда они мне нужны для включения / отключения функций в моем коде. Как правило:

#ifdef THREAD_SAFE
  typedef boost::mutex Mutex;
  typedef boost::mutex::scoped_lock ScopedLock;
#else
  typedef struct M {            } Mutex;
  typedef struct S { S(M m) { } } ScopedLock;
#endif

Таким образом, я могу оставить свой фактический код без изменений. Я доверяю компилятору удалить код плацебо, когда макрос не определен.

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

Не нужно быть экспертом по C ++, чтобы догадаться, что с моим изменением компилятора что-то не так. Я ищу лучшее решение.

Ответы [ 3 ]

6 голосов
/ 25 апреля 2011

То, что вы используете, это не макросы, а обычные возможности препроцессора.Кроме того, вы полагаетесь не на компилятор, а на препроцессор.
Компилятор будет видеть только одну из двух версий, а другая будет исключена до этапа компиляции.Ничего плохого в использовании препроцессора для (условного) включения / исключения кода.Это не какой-то «обман», это то, для чего предназначен препроцессор.

4 голосов
/ 25 апреля 2011

Макросы - это только хороший способ получить информацию из системы сборки в программу. Другой альтернативой является написание собственных сценариев генерации кода или таких инструментов, как SWIG.

Проблема, которую я вижу здесь, заключается в ненужном использовании typedef. Я думаю, что это лучше, потому что это ограничивает введение новых символов (однобуквенных!) И делает код более каноничным.

#ifdef THREAD_SAFE
  using boost::mutex;
#else
  struct mutex {
      struct scoped_lock {
          scoped_lock(mutex const &m) { }
      };
  };
#endif
0 голосов
/ 25 апреля 2011

Хотя я бы не рекомендовал это для этого простого случая, вы можете выделить вещи, которые меняются, и реализовать их в отдельном модуле перевода, а затем позволить вашей системе сборки выбрать правильный файл. Это было бы более уместно, когда есть более радикальные изменения, чем просто исчезновение переменной, как, например, извлечение вызовов библиотеки Windows для эквивалента Unix.

...