【问题标题】:How to learn to program C++ the right way [closed]如何以正确的方式学习 C++ 编程 [关闭]
【发布时间】:2010-05-16 00:19:44
【问题描述】:

我一直在为我的学术课程使用 C/C++ 编程,并且我的印象是我对它掌握得很好。但最近我不得不在一个蓝牙应用程序中工作,该应用程序在 Linux 机器和嵌入式系统中具有服务器和客户端实现。我学习了 bluez 蓝牙 API、套接字/网络编程并对其进行了编码。

然而,在此过程中,我遇到了很多内存泄漏和分段错误以及其他与内存相关的错误。随着代码变得越来越复杂,我几乎失去了对指针、线程和套接字的控制。这让我想知道我有很多东西要学,而他们在基本的 C/C++ 书籍中没有说。所以我想询问可用的资源,这些资源将有助于以专业的方式在 C/C++ 中更好地编写代码。尤其是对于 Linux/Mac 环境(gcc 编译器)。

编辑:将 C 更改为 C++,因为它造成了混乱。

【问题讨论】:

  • 学习 C C++ 编程的“正确方法”的第一步是停止将这对语言视为单一语言,并意识到两者是完全不同的,尤其是在编写好的代码方面。
  • @james 是的,你向我指出这一点是正确的。我主要是指处理内存和线程。 C 在那里,因为我认为 C++ 中的大部分功能都是从 C 派生的,因为在我的业余思维方式中,C 是 C++ 的一个子集。很多时候我发现 C++ 项目也有一些纯 C 代码。但要说清楚,我想学得更好的是 C++。
  • 我认为学习 C++ 的正确方法是为了好玩而编码几年。没有什么比经验更重要的了,当你在复杂的事情上工作并享受它时,你会学得最好。我会说,如果“你失去了对指针的控制”,那么你就很绿了。你需要更多的练习,而不是书本。尝试从头开始编写游戏引擎,或类似的东西。
  • @David 好吧,这是您的意见,所以您有权获得它,我无话可说...我是一个刚刚开始冒险进入狂野编码世界的人...我意识到我需要学习比我的学术课程中的基础书籍更多的东西......所以我想知道其他已经走在这条路上的人的意见......这是错误的吗?......和是的,你怎么可能挖你的鼻子在公共场合挖它被认为是不好的做法。这就是我希望在这里得到一些想法的事情。
  • 你的书面英语表明你没有对你写的东西给予足够的关注和思考。这可能不是真的,但很容易想象你以同样的方式编写 C++,这会导致你的问题。 catb.org/~esr/faqs/hacker-howto.html#skills4

标签: c++ c memory gcc


【解决方案1】:

这个问题太大了,太大了。

简而言之,除了继续前进,您无能为力。您将多次受到段错误的打击。你唯一能做的就是保持专注,不知疲倦地寻找那些错误,并始终相信错误在你的代码中,而不是在你使用的编译器或某些可靠的库中。当您遇到困难时,请在此处发布您具体的、狭隘的问题,并附上相关代码。到时候我们会帮你的。

现在,从这里开始,这实际上取决于您使用哪种语言:C 还是 C++?这些是如此不同的词是不够的。如果您使用的是 C++,那么我给出的第一个建议是一直使用 RAII。如果您使用的是 C,那么请始终注意拥有该指针的对象,何时何地释放它,最重要的是指针指向的位置。此外,始终初始化您的数据,尤其是指针。没关系之前的表现,除了大哦表现。

就是这样。除此之外,请发布您的具体问题,我们将解决它们。 That's the Right Way™ 学习。

【讨论】:

    【解决方案2】:

    如果你malloc 忘记free,你有内存泄漏,你还需要知道什么来避免它们?都是关于设计模式的,不过这些都与语言无关......

    当然,Segfaults 是另一回事...如果您真的想知道如何正确编码 C,请去获取一份 C99 标准的副本。除非我确切地知道标准对它的描述,否则我不能开始对我用 C 编写的任何东西有部分信心。 C++ 也差不多。

    编辑如果您只是 C 或 C++ 的初学者,您可能需要先阅读有关它们的书籍,否则标准可能难以理解。

    【讨论】:

    • 我当然知道在我 malloc 之后释放。但我确信任何尝试在 C++ 中编写任何复杂程序的人都会遇到内存泄漏,因为其他因素如全局变量、函数指针和线程等等。我只是想学习更好的做法来尽量减少这种情况。
    • @sfactor, C++ 注解在这种情况下很有帮助我认为:icce.rug.nl/documents/cplusplus/cplusplus.html 它解释了 C++ 中的许多典型危险,虽然很多东西继承自 C,但没有解释,也许 K&R 会对此有好处。嗯,另外,线程是另一种野兽,C 对它们没有原生支持,所以这取决于你使用的实现如何正确处理它们。基本上只要您正确管理锁就可以了。任何语言的线程都是有问题的。
    【解决方案3】:

    我对处理代码中的内存和正确性问题的建议不是从语言开始,而是从一般的软件实践开始:

    • 一次编程一点,然后进行测试。
    • 测试,测试,测试!在可行的情况下进行单元测试。尽早并逐步发现错误。

    我通过艰苦的经验发现,C 和 C++ 肯定会惩罚你,你越久没有测试你的代码。我敢打赌,您已经尝试调试足够多的这些问题,知道在未经测试的、大小不一的代码库中发现问题可能会令人费解和痛苦。

    对于可以帮助您在这些方面培养纪律性的书籍,我推荐作为一个起点The Pragmatic Programmer,Andrew Hunt 和 David Thomas,Addison-Wesley Professional,1999 年。

    我对 C 和 C++ 的特定提示是:

    • 除非需要,否则不要动态分配。
    • 像鹰一样注意动态内存分配(malloc/new)。确保您已经准确地考虑过谁拥有这些对象,并在创建对象后负责删除它们——即使是在异常的情况下! (这就是 Resource Acquisition Is Initialization 的用武之地。)设计您的代码,使这种所有权是合乎逻辑且可预测的。
    • 使用 Valgrind、Purify 和其他此类工具来帮助发现和诊断内存问题。

    我认为 Stack Overflow 的 Definitive C++ Book Guide and List 上的两本书(一个很好的清单,顺便说一句!)对你最有帮助的是:

    • Thinking in C++ Vol. 2,布鲁斯·埃克尔和查克·艾莉森,普伦蒂斯·霍尔,2003 年
    • Accelerated C++,Andrew Koenig 和 Barbara Moo,Addison-Wesley Professional,2000 年

    【讨论】:

      【解决方案4】:

      我无法评论 C 但对于 C++,获得一本好书 SO definitive book guide 并从较小的项目开始是学习正确编码技术的良好开端。

      【讨论】:

        【解决方案5】:

        我从您的评论中看到,您认为 C 和 C++ 中的内存管理是相同的。事实上,这是一个非常不同的故事。

        感谢 C++ 中的exceptions,您可以获得一种新的、更好的方法来管理错误检查和资源管理。标准做法称为RAII (Resource Acquisition Is Initialization).


        对于初学者,请阅读此主题:whats-the-difference-between-c-and-c

        然后是一些好书:the-definitive-c-book-guide-and-list

        【讨论】:

          【解决方案6】:

          很多东西都是通过经验来学习的。您可以阅读和阅读,但很多时候您只需要潜入。我要说的一件事是使用符号调试器。设置断点并准确查看所有变量的内容将加快发现问题并将其修复 10 倍的速度。

          【讨论】:

            【解决方案7】:

            我认为尽早认识并接受以下几点很重要:

            0.) C++ 不是 C 的超集,C 和 C++ 是两种不同的独立语言。

            1.) C 和 C++ 是强大的语言,但它们对新手程序员并不是特别友好。

            2.) 成功的 C/C++ 程序员永远不会停止学习。探索新材料并复习您已经学过的知识对于使用 C 或 C++ 进行编程至关重要。

            3.) 用 C 或 C++ 编程不仅需要了解该语言,还需要了解该语言背后的概念、该语言开发常用的工具(调试器、构建工具链、编译器、库/ api等)。

            【讨论】:

              【解决方案8】:

              我认为@James McNellis 提出了最好的观点。每种语言都有自己的长处和短处。好的编程是利用特定工具的这些方面以您能够以最稳定和优化的方式完成工作。只有在编写了许多程序之后,您才能预见到何时是使用某种方法的最佳时机,这就是您想要并正在寻求的编程智慧。因此,继续编写程序并继续努力使它们变得更好。

              【讨论】:

                【解决方案9】:

                对于资源管理和避免内存泄漏,RAII 模式和智能指针在 C++ 中是必不可少的。浏览 Marshall Cline 的 C++ FAQ Lite 对于学习语言的细微差别也非常宝贵。

                【讨论】:

                  【解决方案10】:

                  首先,正如已经指出的那样,C 和 C++ 是两种不同的语言。 C++ 是作为 C 的超集创建的,但是从那时起两种语言都在发展,并且 C 中允许的一些结构在 C++ 中是不允许的,反之亦然。

                  如果您想学习一门语言,请先选择其中一种并专注于它。你不能在学习另一个的同时正确地学习它们中的任何一个,因为你只会不断地混淆它们(除非你的大脑与我的大脑的组织方式非常不同;))。

                  您很快就会意识到编程有 3 个不同的领域:

                  • 技术:如何在您选择的语言中实现您的想法(例如 C++ 功能面向对象或通用编程)
                  • 设计模式:代码/依赖关系组织的高级视图(如何解耦您的代码,以便更改一点点不会对整个项目产生影响)
                  • 算法:了解算法和数据结构,了解什么是复杂性(时间/空间)

                  当然,真正的困难在于这 3 个领域相互影响,因此您无法真正孤立地了解它们,这就是为什么您需要选择一门编程语言来试验最后两个领域的原因.但不要只关注技术,熟记 C 或 C++ 标准不会让你成为一名优秀的程序员,它会让你成为一名需要架构师指导工作的优秀技术人员。

                  感谢互联网的出现,当您自己无法找到时,您可能可以在那里搜索您的错误并在网站上询问(例如这个),无论是技术错误(编译错误,程序崩溃) ) 或设计/算法错误(尽管这些错误很难发现,因为它通常可以工作,但要么不优雅,要么很慢)

                  最后一句话,不是因为它有效,它是唯一的方法。您应该尝试并提出各种方法(探索各种范式),以便您可以增加经验并很好地了解什么范式用于什么任务,什么时候适合或笨拙等等......

                  【讨论】:

                    猜你喜欢
                    • 2010-12-07
                    • 2023-04-09
                    • 1970-01-01
                    • 2010-10-04
                    • 2010-09-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-02-26
                    • 2011-02-22
                    相关资源
                    最近更新 更多