В случае g ++ используйте параметр командной строки -ansi
. Это удаляет нестандартную функцию random
из stdlib.h.
По умолчанию g ++ компилируется как -std=gnu++98
, что означает «Стандарт ISO C ++ 1998 года плюс поправки плюс расширения GNU». Так что ваш код не сделал ничего плохого, чтобы быть переносимым. Просто без -ansi
вы не используете совместимый компилятор.
Эти функции stdlib BSD (и Posix) входят в число этих расширений GNU. Из документации glibc:
http://www.gnu.org/s/libc/manual/html_node/BSD-Random.html
"Использование этих функций с библиотекой GNU C не дает никаких преимуществ; мы поддерживаем их только для совместимости с BSD."
В общем, если вы хотите написать код, переносимый на несовместимые компиляторы, вам просто нужно запомнить особенности каждого отдельного компилятора в мире. GCC и MSVC хороши для начала. Даже с -ansi
вы можете сделать gcc несовместимым с другими параметрами командной строки, такими как -O2. Это произошло с фиаско -fdelete-null-pointer-checks
, которое некоторое время назад поражало ядро Linux. То же самое касается платформ, библиотеки которых «расширяют» C (и, следовательно, C ++), таких как BSD и Posix.
Причина, по которой в первую очередь существует стандарт C, заключается в том, что вам не нужно беспокоиться об этом, и лично я считаю, что, к сожалению, другие стандарты портят стандартные заголовки C. Но я предполагаю, что факт наличия этих функций в stdlib на BSD датируется до C89. Если это так, то, по-видимому, это позволило избежать серьезных изменений в BSD и других Unix-системах в то время.
Кстати, я обнаружил, что random()
был в stdlib.h с g++ -E
, что полезно, когда вы хотите знать, что на самом деле системные заголовки делают с вашей программой. Я предполагал, что поиск в сети «случайных» будет бессмысленным. Но "stdlib random" работал довольно хорошо.