为什么要在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');