Подтвердить что ты не робот

Является ли хорошей идеей обернуть #include в блоке пространства имен?

У меня есть заголовок C, который был написан для компиляции как C и С++ (он использует только функции из общего подмножества и использует эту вещь extern "C").

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

namespace foo {
#include <foo.h>
}

Является ли это хорошей идеей? Есть ли у меня альтернативы, которые не включают редактирование файла заголовка?

4b9b3361

Ответ 1

Нет, это плохая идея. С объявлениями С++ он может ввести ошибки компоновщика, поскольку идентификаторы объявляются в неправильном пространстве имен. С помощью объявлений C он работает, но может скрывать столкновения между идентификаторами в глобальном пространстве имен (чего вы пытались избежать, я думаю) до времени ссылки; он действительно не помещает идентификаторы в пространство имен.

Лучшей идеей было бы разместить свои собственные идентификаторы в пространстве имен и не определять ничего, кроме main в глобальном.

Ответ 2

Я сделал это "помещаем его в пространство имен" для <windows.h> в конце 1990-х годов.

Хотя и не с полной поддержкой: это было на принципе добавления поддержки того, что мне было нужно, когда мне это нужно.

Ключом к этой работе было проверить, какие заголовки библиотеки C были включены, и обязательно включите их в первую очередь. Это сводилось к 4 таким заголовкам, IIRC. Однако любовь к макросам в Microsoft усложнила ситуацию.

Таким образом, это может быть сделано на практике для заголовков C (или С++ ограничено C-подобным подмножеством), но по стоимости обновления вашей обертки для каждой новой версии обертки, что является непрактичным и/или очень дорогостоящим. Не говоря уже о трудоемком.

В заключение нет, это не очень хорошая идея.: -)

Говоря по опыту.