Зачем следует избегать функции system() в C и С++?
Я видел много людей на форумах, говорящих, чтобы избежать функции system()
, например system("cls")
. Я не понимаю, почему.
Скажите, пожалуйста, почему я должен избегать этой функции. А также, поскольку clrscr()
не работает с CodeBlocks, каковы другие способы очистки экрана без использования функции system()
?
Ответы
Ответ 1
Здесь есть несколько проблем:
- Прежде всего,
system()
как функция кросс-платформенная и доступна не только для Windows или Linux. Тем не менее, фактические вызываемые программы могут быть зависимыми от платформы. Например, вы можете использовать system()
для создания каталога: system("md Temp")
. Это будет работать только в Windows, так как Linux не знает команду под названием md
. Для Linux это должна быть system("mkdir Temp")
. Это продолжается, поэтому вам потребуется индивидуальное решение для каждой платформы. - Это всегда порождает дочерний процесс, который затем выполняет что-то. Обычно это будет медленнее, чем какой-либо встроенный код, например, команда или программа должна быть загружена, загружать собственные зависимости, тогда она должна быть выполнена и т.д., Что обычно намного больше.
Если вы просто проводите быстрое тестирование на одной платформе, использование system()
совершенно прекрасное, но вы не должны использовать его в производственных средах, если только вам это не нужно. Например, вы можете разрешить пользователю устанавливать внешнюю программу, которая затем выполняется. Для чего-то вроде этой system()
отлично.
Ответ 2
Существует ответ об использовании system()
. И нет стандартного средства С++ для очистки окна консоли. Для платформы Windows вы можете использовать такой код:
void clear()
{
COORD startPos = { 0, 0 };
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO screen;
DWORD written;
GetConsoleScreenBufferInfo(hConsole, &screen);
FillConsoleOutputCharacterA(hConsole, ' ', screen.dwSize.X * screen.dwSize.Y, startPos, &written);
FillConsoleOutputAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE, screen.dwSize.X * screen.dwSize.Y, startPos, &written);
SetConsoleCursorPosition(hConsole, startPos);
}
И для linux никогда не пробовал, но нашел способ:
#include <curses.h>
erase();
Ответ 3
Вам следует избегать системного вызова, потому что
- Эти вызовы не переносятся, они могут не работать на других платформах.
- Те звонки дорогие для звонков, почему вы позволите своим ресурсам съесть?
Как очистить консоль? Вы можете использовать std::cout << std::string(50, '\n');