为什么要在C和C ++中避免使用system()函数?

我在论坛上看到很多人告诉他们避免使用system()函数,比如system("cls") 。 我不明白为什么。

请告诉我为什么要避免这个function。 而且,由于clrscr()不能与CodeBlocks一起使用,有什么其他方法可以在不使用system()函数的情况下清除屏幕?

这里有很多问题:

  • 首先, system()作为一个function是跨平台的,不仅可以在Windows或Linux上使用。 但是,被调用的实际程序可能与平台有关。 例如,您可以使用system()创建目录: system("md Temp") 。 这只适用于Windows,因为Linux不知道名为md的命令。 对于Linux,它必须是system("mkdir Temp") 。 这种情况继续存在,因此您需要为每个平台提供自定义解决方案。
  • 这将始终生成一个子进程,然后执行某些操作。 这通常比某些内联代码慢,例如必须加载命令或程序,加载它自己的依赖项,然后必须执行等等,这通常需要更多的工作。

如果您只是在一个平台上进行一些快速测试,那么使用system()就完全没问题了,但除非您真的需要,否则不应该在生产环境中使用它。 例如,您可以允许用户设置随后执行的外部程序。 对于像这样的system()完全没问题。

有一个关于system()用法的答案。 并且没有标准的C ++方法来清除控制台窗口。 对于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  erase(); 

你应该避免系统调用,因为

  • 这些调用不可移植,可能无法在其他平台上运行。
  • 这些电话费用很贵,你为什么要让你的资源被吃掉?

如何清除你的控制台? 你可以使用std::cout << std::string(50, '\n');