Почему программа на c++ работает без указания пространства имен для некоторых функций

Почему необходимо указывать пространство имен для cin и endl, но необязательно для srand и time?

#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
    srand(static_cast<unsigned int>(time(0)));
    int randomNumber = rand() % 6 + 1;
    std::cout << randomNumber << ", " << std::endl;
    return 0;
}

Ответы (4 шт):

Автор решения: Qwertiy

Потому что унаследованные из си функции доступны в глобальном пространстве имён.

→ Ссылка
Автор решения: AlexGlebe

Ваш код работает в безымянном пространстве имён ::. Функции srand и time объявлены там-же. Потоки в <iostream> объявлены в другом пространстве имён std, и чтобы использовать функции из другого пространства нужно так писать std :: cout.

→ Ссылка
Автор решения: ori

Вы используете библиотеки, которые предназначены для си, но притом для совместимости, эти же библиотеки можно использовать и в с++. В си нет никаких пространств имён, классов и т.п. поэтому при обращении к си функциям, вам нет необходимости писать что либо перед именем функций.

В то время, как в стандартной библиотеке с++ есть такие заголовочные файлы которые начинаются на c..., исключением являются лишь некоторые из, все они предназначены для си, но так же доступны в с++ для совместимости.

Пишите на с++? Используйте библиотеки предназначеные именно для него.


Для того чтобы вы поняли о чем идёт речь, смотрите, я напишу свое пространство имён, и скажу, что у меня там есть класс строки:

#include <string>
namespace ori {
    using string = ::std::string;
};

Теперь я могу писать код без использования пространства имён ::std::... И обращаться только в свое пространство имён ori.

::ori::string str;

На самом же деле, это просто алиас для класса из стандартной библиотеки.

→ Ссылка
Автор решения: HolyBlackCat

У всех хедеров, доставшихся по наследству из C (напр. <cstdlib>, <ctime>), есть по две версии: <c??> и <??.h>, например <ctime> и <time.h>.

<c??> объявляют имена в пространстве имен std.

<??.h> объявляют имена в глобальном пространстве имен.

Но обоим вариантам разрешается объявлять имена и там и там, что и произошло в вашем случае.

→ Ссылка