使用纯代码编写而不使用第三方头文件

4
当我尝试学习C/C++时,我总是觉得很沮丧需要使用头文件。这让它看起来像不是我的代码,而是我在使用其他人的代码。我只想让它变得纯粹,并且自己编写,而不使用头文件。
我知道C/C++包含可以为开发人员提供一些函数的库,例如创建向量。 Boost库类似于此,但是,我想编写自己的代码,也许为我的工作创建自己的库。
但是这可能吗?如果我为C/C++编写了自己的头文件,几乎像iostream.h文件一样,只是我自己制作了它,并进行了优化,那么它对我的应用程序/项目有益吗,还是应该使用编程语言中包含的标准库?

15
这个想法非常糟糕。 - Rapptz
9
使用他人的代码是好的。当你在编程时,代码复用正是你想要的,这表明你很好地利用了自己的时间和技能。当然,你可以自己编写所有代码,但如果别人已经完成了,为什么还要费事呢?好的程序员是懒惰的,意味着你会找到最有效率的路径。 - Adam
17
对于特定于您的项目和需求的专用代码?当然可以。但是,你是否应该重写已经存在多年,实际上数十年进行了错误修复和优化的通用代码呢?这极少会有好结果。使用经过充分测试的基本组件来创建新而有趣的东西吧。 - Paul Roub
13
这是一个可怕的想法,而且你是完全错误的... 但这并不意味着这是一个糟糕的问题。 - Lightness Races in Orbit
4
哦,而“C/C++”并不存在。 - Lightness Races in Orbit
显示剩余6条评论
5个回答

14

我的回答至少部分地以一种修辞问题的形式呈现:

你也打算写自己的编译器吗?

你总是在使用别人编写的东西,对于通用用途来说,这是非常好的事情。为什么呢?因为他们是他们领域的专家,因为他们是多个人,因为他们的代码经过了数十年严格的同行评审,被数百万人进行了彻底的测试,并进行了许多改进版本的迭代。

抵触这种本能是一回事,但由于这个原因拒绝使用标准头文件则是完全不同的事情, 特别是当你如此武断地划定界限时

简而言之,C++标准定义标准库并且你的编译器供应商会提供其实现,这有非常充分的理由。我强烈建议你遵循这个原则。

…这就是为什么我的观点不是“滑坡”论证!


1
并且发明你自己的处理器,使用你自己手工制作的工具从原材料开始创建,重新推导出必要的物理和数学定律,编写所有自己的操作系统、编译器、库、汇编器、调试器等。 - Puppy
1
@Puppy:创造出新的物理和数学定律,从中构建一个全新的现实。这是唯一的方法。 - Lightness Races in Orbit
1
尽管当前的物理实现相当不错,但显然存在一些缺陷和难以发现的错误... 如果我们放弃它并从头开始,那真的是最好的选择。@LightnessRacesinOrbit,你确实有点眼光。 - Fors
更加严肃地说,编写编译器是一种非常好的体验,可以加深对事物运作原理的理解。但是很少有人(如果有的话)能够编写出能够与Clang、GCC、MSVC、ICC或类似稳定编译器相媲美的编译器,这些编译器已经有多年的开发历史和庞大的用户群体来发现并修复错误。 - Fors
@Fors:只是一个简单语言的简单编译器。 - Puppy
显示剩余2条评论

4

当然你应该使用标准库。不这样做的唯一原因是:

  • 你想要的类不存在。
  • 你是专业的C ++程序员,某些实现方式真的很烦人。
  • 作为初学者,您想通过尝试构建自己的简单数据存储类型(例如任何向量类型)来学习一些东西

你对“所有东西都应该由自己制作”的想法并不罕见,但一旦你实现了其中一种标准类型,并花费了数小时,而你的实际项目还没有进展一行,当你的新“自己”的类型仍然缺少一半的功能时,那么你会意识到使用现有库(特别是标准库或其他知名库,如boost)可能是明智的选择。


1
“类模板” - Lightness Races in Orbit
我不是很喜欢第二点。具体实现细节不应该成为接口的关注重点。更何况标准库中的大多数类(如容器)都允许您指定一些内部操作,例如分配。 - Rapptz
@Rapptz:这并不完全是错的。一个明显的例子就是EASTL:EA没有访问可以足够优化他们使用情况的stdlib实现。这是为他们的需求做得更好的绝佳机会。然而,这应该是极其罕见的,因为更常见的情况是,如果您对stdlib实现有问题,您应该与供应商讨论并在那里解决它,而不是用您自己拙劣的自制替代品替换整个东西,几乎肯定在其他方面至少劣数个数量级。 - Lightness Races in Orbit
@Rapptz:我理解你的观点。我所说的“实现”是在更广泛的意义上,当然在编程环境中有一些批判性。也许我应该只是说“有些事情让你感到烦恼”。 - bluewater2
@bluewater2:没有限定条件(例如我上面的例子),这仍然不是一个足够好的理由。 - Lightness Races in Orbit
@LightnessRacesinOrbit:我认为作为一名“专业的C++程序员”,如果你决定这样做,你应该有一个理由。 - bluewater2

2

这使得它看起来不像是我的代码,而是我在使用别人的代码。

你会如何编写 <fstream> 库?打开文件并不是纯 C++ 语言能够完成的事情,需要一个提供此功能的库。从根本上讲,打开文件必须由操作系统完成,并且操作系统将其暴露给您的代码。操作系统本身必须处理其他软件,以使其能够执行这些操作。

还有这个问题:加法并非通过魔法发生,因此必须有人为您的程序明确说明如何执行 a + b。编写 a + b 会让您感觉好像在使用其他人的代码,描述 CPU 上如何实现加法指令的代码?

没有一款软件可以做到万能。每个软件都必须与其他组件进行交互,几乎总会有一些其他组件是其他人的作品。您应该习惯于这样一个想法:您的软件有自己的责任范围,并且将依赖于其他人来处理其他事情。


2
换句话说,“抽象化,兄弟”。完全正确。 - Lightness Races in Orbit

1
重新发明轮子是一个坏主意。特别是如果那个轮子已经由比你更聪明、更有知识的人设计和构建,并且被所有试图构建汽车(编程C ++)的人所知道。
使用标题;不要傻。

0

当一个人重新实现大多数标准例程时,他可能会想要创建一种新的语言。这就是为什么我们有许多选择的语言。人们已经想出了更好的想法。重新发明轮子是好的——我们现在不再使用战车轮胎。

C和C++可能不是最好的,但是它们有40年的历史,具有持久力(和很多包袱)。因此,如果您要使用某种语言进行编程,请使用其资源,利用其优点和缺点。很可能,您的解决方案不会比已经改进了成千上万个其他库的现有库更好。

但是谁知道——您的代码也许会更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接