Зачем следует избегать функции 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');