Как я могу использовать int32_t без использования STD? - PullRequest
0 голосов
/ 24 мая 2018

Вот мой код:

#include <iostream>

int main()
{
    int32_t i = 5;
    std::cout << "i: " << i << '\n';
}

Вот вывод:

$ clang++ -std=c++11 -pedantic -Wall -Wextra foo.cpp && ./a.out 
i: 5

Вот мой вопрос:

По-видимому, стандарт C ++ определяет int32_t в cstdint в пространстве имен std.

В моем коде я не включил cstdint и не использую пространство имен std.Почему компилятор не жалуется тогда?

1 Ответ

0 голосов
/ 24 мая 2018

Имя int32_t также появляется в глобальной области видимости заголовка библиотеки C stdint.h.Это может сделать его глобально видимым также в C ++.

Раздел [Заголовки] говорит:

... содержимое каждого заголовка cname совпадает с заголовком соответствующего заголовка name.h , как указано в стандартной библиотеке языка C.Однако в стандартной библиотеке C ++ объявления (за исключением имен, которые определены как макросы в C) находятся в пределах области имен пространства имен std. Не указано, будут ли эти имена (включая любые перегрузки, добавленные в [language.support] через [thread] и [depr]) сначала объявлены в глобальной области пространства имен и затем внедрены в пространство имен stdс помощью явных объявлений использования .

Стандарт также содержит общий оператор :

Заголовок C ++ может включать другие заголовки C ++.

Поэтому, включив <iostream>, вы гарантируете для просмотра объектов потока, но также может получить доступ и к некоторым другим функциям библиотеки..

Поскольку эти косвенные включения не определены, результат варьируется в зависимости от реализации.Таким образом, программа всегда должна включать все необходимые заголовки, чтобы быть переносимой на другой компилятор.

...