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