Какие конструкции C появляются в пространстве имен std?
Рекомендуемый способ включения заголовка стандартной библиотеки C <foo.h>
в C++ стоит включить соответствующий заголовок C++ <cfoo>
,
Исходя из моего опыта, это помещает некоторые из соответствующих C-конструкций в std
пространство имен, но другие в глобальном масштабе, и иногда они появляются в обоих местах (т. е. в std
пространство имен и в глобальном масштабе).
Это зависит как от компилятора (некоторые любят включать size_t
только в std
и не в глобальной области видимости, другие всегда имеют его в глобальной области видимости, и в конструкции (например, ни assert
ни error
когда-либо появляются в std
пространство имен, несмотря на в том числе cassert
а также cerrno
).
Что требуется от стандарта, и есть ли какое-либо простое правило для переносимого доступа к конструкциям C относительно местоположения в или из std
пространство имен (что-то лучше, чем using namespace std
)?
Этот вопрос охватывает ту же почву, но ответы там уже отражают мое понимание того, что cfoo
кладет все в std
- но не отвечает на вопрос, почему такие вещи, как assert
а также errno
не появляются в std
в таком случае и как узнать полный список подобных "исключений".
1 ответ
Assert и errno являются макросами препроцессора, и, будучи макросами, они не распознают пространства имен и области видимости. (препроцессор запускается перед компиляцией и не учитывает какую-либо область видимости / пространство имен)
Все, кроме макросов в тех <cfoo>
Заголовки должны быть помещены в пространство имен std.