Это хорошая идея, чтобы обернуть #include в блок пространства имен? - PullRequest
38 голосов
/ 13 июля 2011

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

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

namespace foo {
#include <foo.h>
}

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

Ответы [ 2 ]

42 голосов
/ 13 июля 2011

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

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

5 голосов
/ 24 октября 2012

В конце 1990-х я сделал это «поместил это в пространство имен» для <windows.h>.

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

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

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

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

Из опыта.

...