Является ли хорошей идеей обернуть #include в блоке пространства имен?
У меня есть заголовок C, который был написан для компиляции как C и C ++ (он использует только функции из общего подмножества и использует эту extern "C"
вещь).
Проблема в том, что заголовок объявляет материал в глобальном пространстве имен. Я бы предпочел избежать этого по обычным причинам. Я думал об этом:
namespace foo { #include }
Делает это хорошая идея? Есть ли у меня альтернативы, которые не include редактирование файла заголовка?
- Пространство имен и class с тем же именем?
- Пространства имен XML и атрибуты
- Как cin Space в c ++?
- Автоматически сокращать удаленное пространство в mongodb?
Нет, это плохая идея. С объявлениями C ++ это, скорее всего, приведет к ошибкам компоновщика, поскольку идентификаторы объявляются в неправильном пространстве имен. С помощью объявлений C он работает, но может скрывать столкновения между идентификаторами в глобальном пространстве имен (чего вы пытались избежать, я думаю) до времени ссылки; он действительно не помещает идентификаторы в пространство имен.
Лучше всего было бы поместить свои собственные идентификаторы в пространство имен и не определять ничего, кроме main
в глобальном.
Я сделал это «поместил его в пространство имен» для
в конце 1990-х годов.
Хотя и не с полной поддержкой: это было основано на том, чтобы добавить поддержку того, что мне было нужно, когда мне это нужно.
Ключом к этой работе было проверить, какие заголовки библиотеки C были включены, и обязательно включите их в первую очередь. Это сводилось к 4 таким заголовкам, IIRC. Однако любовь Microsoft к макросам осложнила ситуацию.
Таким образом, это можно сделать на практике для заголовков C (или C ++, ограниченных C-подобным подмножеством), но по стоимости обновления вашей оболочки для каждой новой версии обертки, что является непрактичным и / или очень дорогостоящим. Не говоря уже о трудоемкой работе.
В заключение нет, это не очень хорошая идея. 🙂
Говоря по опыту.