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