Почему программа на 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 шт):
Потому что унаследованные из си функции доступны в глобальном пространстве имён.
Ваш код работает в безымянном пространстве имён ::. Функции srand и time объявлены там-же. Потоки в <iostream> объявлены в другом пространстве имён std, и чтобы использовать функции из другого пространства нужно так писать std :: cout.
Вы используете библиотеки, которые предназначены для си, но притом для совместимости, эти же библиотеки можно использовать и в с++. В си нет никаких пространств имён, классов и т.п. поэтому при обращении к си функциям, вам нет необходимости писать что либо перед именем функций.
В то время, как в стандартной библиотеке с++ есть такие заголовочные файлы которые начинаются на c..., исключением являются лишь некоторые из, все они предназначены для си, но так же доступны в с++ для совместимости.
Пишите на с++? Используйте библиотеки предназначеные именно для него.
Для того чтобы вы поняли о чем идёт речь, смотрите, я напишу свое пространство имён, и скажу, что у меня там есть класс строки:
#include <string>
namespace ori {
using string = ::std::string;
};
Теперь я могу писать код без использования пространства имён ::std::... И обращаться только в свое пространство имён ori.
::ori::string str;
На самом же деле, это просто алиас для класса из стандартной библиотеки.
У всех хедеров, доставшихся по наследству из C (напр. <cstdlib>, <ctime>), есть по две версии: <c??> и <??.h>, например <ctime> и <time.h>.
<c??> объявляют имена в пространстве имен std.
<??.h> объявляют имена в глобальном пространстве имен.
Но обоим вариантам разрешается объявлять имена и там и там, что и произошло в вашем случае.