Защита остального мира от системных заголовков - PullRequest
2 голосов
/ 28 февраля 2012

Добрый день!

В настоящее время я ищу "способ" защитить остальную часть программы от системных заголовочных файлов.Часто невозможно просто поместить его в детальное пространство имен из-за зависимостей самого системного заголовка.Теперь я подумал об использовании объявленных переменных extern в подробном пространстве имен и присвоении им значения в файле .cpp, который включает системные заголовки.Это казалось идеальным решением, так как внешний мир даже не знает большинство вещей, и все, что вам нужно, может быть упаковано в пространство имен деталей.Но есть одна проблема: Вы не можете инициализировать константы enum внешними константами.

Мой вопрос: есть ли способ использовать типы enum / struct с внешними переменными?Или есть даже лучший способ защитить программу от системных заголовков?

VS11 говорит:

namespace detail
{
  extern const int value;
}

const auto val = detail::value; // ok

enum class my_enum
{
  value = detail::value, // "expression must have a constant value"
};

struct my_struct
{
  static const auto value = detail::value; // "constant value is not known"
};

1 Ответ

1 голос
/ 28 февраля 2012

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

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

...