Так что это то, что я всегда удивлялся, но никогда не был полностью уверен в этом. Так что это просто вопрос любопытства, а не настоящая проблема.
Насколько я понимаю, когда вы делаете что-то вроде #include <cstdlib>
, все (кроме макросов, конечно) объявляется в пространстве имен std::
. Каждая реализация, которую я когда-либо видел, делает это, делая что-то вроде следующего:
#include <stdlib.h>
namespace std {
using ::abort;
// etc....
}
Что, конечно, влияет как на глобальное пространство имен, так и на std
. Это поведение гарантировано? Или возможно, что реализация могла бы поместить эти вещи в std
, но не в глобальное пространство имен? Единственный способ, которым я могу придумать, это сделать так, чтобы ваш libstdc ++ реализовывал каждую функцию c самостоятельно, помещая их в std
напрямую, а не просто включая существующие заголовки libc (потому что нет механизма для удаления чего-либо из пространства имен). Что, конечно, требует больших усилий и приносит мало пользы.
Суть моего вопроса в том, строго ли соответствует и гарантированно работает следующая программа?
#include <cstdio>
int main() {
::printf("hello world\n");
}
РЕДАКТИРОВАТЬ: Ближайший я нашел это (17.4.1.2p4):
За исключением случаев, указанных в пунктах 18 -
27, содержимое каждого заголовка cname
должны быть такими же, как у
соответствующий заголовок name.h, а
указано в ИСО / МЭК 9899: 1990
Языки программирования C (раздел 7) или
ISO / IEC: 1990 Языки программирования - C
ПОПРАВКА 1: C Целостность, (пункт 7),
в зависимости от обстоятельств, как будто путем включения. В
Стандартная библиотека C ++, однако,
декларации и определения
(за исключением имен, которые определены как
макросы в C) находятся в пространстве имен
область действия (3.3.5) пространства имен std.
Честно говоря, я мог бы интерпретировать так или иначе. «содержимое каждого заголовка cname должно быть таким же, как и содержимое соответствующего заголовка name.h, как указано в ISO / IEC 9899: 1990 Языки программирования C», говорит мне, что они могут потребоваться в глобальном пространстве имен, но «В C ++ Standard Library, однако, объявления и определения (кроме имен
которые определены как макросы в C) находятся в пределах области имен (3.3.5) пространства имен std. "говорит, что они находятся в std (но не указывает никакой другой области видимости, в которой они находятся).