Какие конструкции 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.

Другие вопросы по тегам