Возможный дубликат:
Можно ли обернуть #include в блоке пространства имен?
У меня есть проект с классом log
в глобальном пространстве имен (::log
).
Итак, после #include <cmath>
, компилятор выдает сообщение об ошибке каждый раз, когда я пытаюсь создать экземпляр объекта моего класса журнала, потому что <cmath>
загрязняет глобальное пространство имен множеством трехбуквенных методов, один из них являющейся логарифмической функцией log()
.
Итак, есть три возможных решения, каждый из которых имеет свои уникальные уродливые побочные эффекты.
- Переместить класс журнала в собственное пространство имен и всегда обращаться к нему с полным именем. Я действительно хочу избежать этого, потому что регистратор должен быть максимально удобным для использования.
- Напишите файл
mathwrapper.cpp
, который является единственным файлом в проекте, который включает<cmath>
, и делает все необходимые функции<cmath>
доступными через обертки вnamespace math
. Я не хочу использовать этот подход, потому что мне нужно написать оболочку для каждой требуемой математической функции, и это добавит дополнительный штраф за вызов (частично отмененный флагом-flto
) - Решение, которое я сейчас рассматриваю:
Заменить
#include <cmath>
по
namespace math {
#include "math.h"
}
а затем вычислить функцию логарифма через math::log()
.
Я пробовал это, и он действительно компилирует, связывает и работает как ожидалось. Однако он имеет несколько недостатков:
- Это (очевидно) невозможно использовать
<cmath>
, потому что код<cmath>
обращается к функциям по их полностью определенным именам, и он не рекомендуется использовать в С++. - У меня действительно очень плохое чувство, как будто я будет атакован и поглощен живыми хищниками.
Итак, мой вопрос:
- Есть ли какая-либо рекомендация/соглашение/и т.д., запрещающая вставлять директивы include в пространства имен?
-
Может ли что-то пойти не так с
- различные стандартные реализации библиотек C (я использую glibc),
- разные компиляторы (я использую g++ 4.7, -std = С++ 11),
- сшивание?
- Вы когда-нибудь пробовали это делать?
- Есть ли альтернативные способы изгнания математических функций из глобального пространства имен?
Я нашел несколько похожих вопросов о stackoverflow, но большинство из них касалось включения других заголовков С++, которые, очевидно, являются плохими идеями, и те, которые не были сделаны противоречивыми утверждениями о связи поведения для библиотек C. Кроме того, было бы полезно дополнительно поставить #include <math.h>
внутри extern "C" {}
?
изменить
Итак, я решил сделать то, что, возможно, все остальные, и поместить весь мой код в пространство имен проектов и получить доступ к регистратору с полным именем, когда включается <cmath>
.