学习 C++ 发现使用 system() 函数(比如 pause 或 cls 等)不好
我有两个疑问:
为什么使用它们不好?
我找到了这两个代码:
1.- 选项:
void clear_screen()
{
DWORD n; /* Number of characters written */
DWORD size; /* number of visible characters */
COORD coord = {0}; /* Top left screen position */
CONSOLE_SCREEN_BUFFER_INFO csbi;
/* Get a handle to the console */
HANDLE h = GetStdHandle ( STD_OUTPUT_HANDLE );
GetConsoleScreenBufferInfo ( h, &csbi );
/* Find the number of characters to overwrite */
size = csbi.dwSize.X * csbi.dwSize.Y;
/* Overwrite the screen buffer with whitespace */
FillConsoleOutputCharacter ( h, TEXT ( ' ' ), size, coord, &n );
GetConsoleScreenBufferInfo ( h, &csbi );
FillConsoleOutputAttribute ( h, csbi.wAttributes, size, coord, &n );
/* Reset the cursor to the top left position */
SetConsoleCursorPosition ( h, coord );
}
2.- 选项:
void clrscr()
{
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord = {0, 0};
DWORD count;
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdOut, &csbi);
FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
SetConsoleCursorPosition(hStdOut, coord);
}
两者中哪一个更适合替代“cls”功能?
注意: 如果您对此有更好的代码,如果您可以将其发送给我,那将非常有用。
通常,当在任何书面或文件中不鼓励一种做法时,都会包括其原因。更详细地阅读您的来源,他们应该解释原因......除非您在互联网论坛上阅读过它,否则这些信息可能被视为理所当然。
在不知道代码的动机或目标的情况下,很难知道某些东西是否可取,但总的来说,不鼓励使用操作系统的特定功能,因为它会使代码不可移植。但是代码不可移植只是一个问题,如果你认为它应该是。
因此,通过选择特定于操作系统的功能(您的代码示例表明您正在为 Windows 控制台编程),您可以将代码限制在该操作系统上并使其与其他系统不兼容;如果这是您想要的,那没有问题,但如果不是,那将是使用那些操作系统特定功能不好的原因。
不知道。您的代码示例在低级别与控制台一起工作,而无需委托调用
system()
,如果知道您的特定动机,则很难定义一种方法是否比另一种更好。在不知道更多细节的情况下,我认为该选项
clear_screen
的效果比第一个要少一些,clrscr
因为第一个只覆盖键入的字符,而第二个覆盖整个屏幕。基本上有四个原因:
您正在调用您无法控制的外部程序。可能会发生不同版本的操作系统具有不同版本的程序,这可能会使您的代码无法工作。
它们依赖于操作系统。调用
system
使您难以在 Windows 和 Linux 之间迁移代码(例如),因为该程序可能在其他操作系统中不可用。这是一个非常缓慢的选择。必须运行外部程序
system
意味着控制台必须解释您的输入并运行外部程序......通常有更快和更可靠的替代方案,无论是在标准本身内还是通过使用第三方库。结果的捕获并不明显。调用控制台命令来检索应用程序的信息可能并不明显(例如,输出可能会受到本地系统设置的影响)。调用本机函数通常是更好的解决方案,因为数据通常是结构化的。
我认为两者都会起作用。如您所见,它们是两个几乎相同的解决方案(假设第一个更完整)。无论如何,它们都是针对 Windows 环境的特定解决方案。