我最近开始接触C++编程,并且获得了很多经验。我过去的几个程序一直在使用 system() 命令,我读过这应该是一个非常糟糕的主意。首先,为什么这是一个坏主意?
我在 Linux 上使用它来执行诸如清除屏幕 [例如:system("clear")] 和启动程序的其他部分等操作,例如返回菜单 [例如:system("./menu")]。可以将它用于我上面展示的事情(无论如何都是主要的事情),还是有更好的解决方案?我只是将编程作为一种爱好,但我仍然不喜欢编写蹩脚的程序。提前致谢!!
存在的问题system
可以分为三到四个不同的问题:
资源使用 - 系统使用相当多的系统资源,创建新进程并在其中执行 shell 需要内存、执行时间和文件系统 I/O。
外部程序的可移植性(system("clear");
在 Windows 上不起作用,因为“cls”命令用于清除屏幕 - 或者至少不会清除屏幕,如果你真的很不幸,有人编写了一个名为“clear”的清理程序,可以删除客户数据库如果您是系统管理员用户。如果您需要向程序传递参数,并且不同的环境使用不同的选项和参数集,那么它会变得更加有趣。
安全。如果你打电话system("clear");
从你的应用程序中,有人用一些不同的代码替换了本地“清除”,这些代码也会删除一些文件,或者或多或少邪恶的东西,这将是一件坏事。由于启动外部程序,您需要非常具体地了解该程序的路径,然后就会遇到可移植性问题。
解决方案是什么实际上取决于您想要实现的目标。
对于少数情况,使用system
或密切相关的功能之一,例如popen()
将是正确的事情。在 Linux 和其他版本的 Unix 上,使用fork()
其次是exec()
可能是正确的事情 - 至少它减少了资源开销。
如果是system("clear");
,它可以被替换为输出一个短字符序列 - 例如"\033[0J"
,它适用于任何 ANSI/VT100 兼容的终端/控制台窗口 - 它几乎涵盖了您现在发现的任何内容,除非您真的去寻找晦涩和不寻常的系统。 [Windows除外,需要调用控制台API中的“clearscreen”函数]。
一般来说,如果需要便携性,system()
通常不是一个好的解决方案,使用可在多个平台上使用的库[或自己创建这样的库]是更好的选择。
从资源和可移植性的角度来看,您的调用示例system("./menu");
听起来也不是正确的事情,因为这将开始一个新的menu
程序,您可能已经运行过一个程序 - 除非您的menu
选择成功后程序退出。如果您继续启动越来越多的进程,它最终会填满整个系统,即使在具有大量内存的现代系统上需要一段时间。
在这里,我的解决方案是构建一个包含所有功能的更大的程序,并让主菜单简单地调用程序中的函数。通常可以使用某种层次结构创建多层菜单,其中一个菜单选择要么导致另一个菜单,要么“做某事”——类层次结构或某种函数指针表可能是正确的解决方案,但同样,这是一个相当广泛的主题,而且绝对没有一个答案是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)