функции C, объявленные в заголовках <c ____>, гарантированно находятся в глобальном пространстве имен, а также в std?

Так что это то, что я всегда удивлялся, но никогда не был полностью уверен в этом. Так что это просто вопрос любопытства, а не настоящая проблема.

Насколько я понимаю, когда ты делаешь что-то вроде#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, как указано в ISO / IEC 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 (но не указывает какую-либо другую область действия, в которой они находятся).

Ответы на вопрос(3)

Ваш ответ на вопрос