学习C程序设计的资源

来自OO背景(C#/ java)我正在寻找资源来学习如何很好地设计纯C程序。

虽然我熟悉C的语法,并且我可以编写小程序,但我不确定采用哪种方法来处理大型应用程序,以及采用何种技术。 任何你可以推荐的东西。

编辑:我很高兴完全放弃面向对象在C编程的目的,我的兴趣在于学习如何构造一个没有面向对象的程序,我想了解如何使用过程语言设计程序的好方法,例如C语言。


本文章列出了包含大部分经典C / Unix作品的unix书籍。 对于Windows上的C编程,Petzold的Programming Windows可能是最好的开始。

对于C程序设计,一些unix编程书籍会告诉你片段,但我不知道“C程序结构”一书。

如果你习惯于Java,那么C编程的一些技巧是:

  • 利用堆栈。 通常当你调用一个过程时,你会希望在调用者的栈帧中分配变量,并将指针传递给你想调用的过程。 这将比使用malloc()动态分配内存的速度快得多,而且容易出错。 在适当的地方做到这一点。

  • C不会进行垃圾回收,所以动态分配数据项更加烦琐,你必须跟踪它们以确保它们被释放。 在栈上分配的变量(见1)在适用的地方更“惯用”。 另外,你不必释放它们 - 这是局部变量的奖励。

  • 对(2)的适用,考虑一种体系结构,其中你的函数返回一个状态或错误代码,并按照(1)使用栈传入和传出数据。

  • 了解setjmp()longjmp()做什么的。 它们对通用错误处理机制非常有用,而不是结构化的异常处理功能。

  • C不支持异常。 参见(3)。

  • 林特是你的朋友。 斯普林特更友好。

  • 了解预处理器的功能以及即使可以,也不应该用它做什么。

  • 了解字节顺序,字对齐,指针算术和其他低级架构奥秘的来龙去脉。 与流行观点相反,这些不是火箭科学。 如果您感觉敏锐,请尝试使用汇编语言,并掌握相关知识。 它会为你理解C程序中发生的事情做很多事情。

  • C没有模块范围的概念,所以计划使用include,原型声明以及使用externstatic来创建私有范围和导入标识符。

  • C语言的GUI编程在所有平台上都很乏味。

  • (10)的apropos学习至少一种脚本语言(如Tcl,Lua或Python)的C API。 在许多情况下,C的最佳使用是作为一个应用程序中的核心高性能引擎,而该应用程序基本上是用其他语言编写的。

  • 构造函数的等价物是一个初始化函数,用于将指针传递给要设置的项目。 通常你可以通过调用看起来像setup_foo(&my_foo)的函数来看到setup_foo(&my_foo) 。 最好将初始化分配与分配分开,因为您可以使用此函数初始化已分配给堆栈的项目。 类似的原则适用于析构函数。

  • 大多数人认为匈牙利的符号与匈牙利文字一样可读。 这个例外是匈牙利本土人,他们通常会发现匈牙利符号像楔形文字一样易读。不幸的是,匈牙利符号在Windows软件中广泛存在,整个Win32 API都使用它,预计会对此编写的软件的易读性产生影响平台。

  • C / Unix书籍,甚至是像W Richard Stevens所写的那些书籍都非常好的,往往可以通过亚马逊市场非常便宜地获得二手书籍。 按照特定的顺序,获得K&R,Stevens APUE和UNP 1&2,龙书,Rochkind,Programming Pearls,Petzold和Richter(如果在Windows上工作)以及任何其他经典C / Unix作品的副本。 阅读,用铅笔在它们上面涂写,通常与书本交互。

  • 网络上有很多很多很好的C / Unix编程资源。

  • 阅读并理解C编程的十诫,以及关于诫命背后的原因和理由的一些元讨论。 这在一定程度上显示了它的年龄,虽然它的大部分仍然是相关的,并且模糊的编译器在嵌入式系统领域仍然很常见。

  • 如果你想写解析器,Lex和Yacc是你的朋友。

  • 正如Navicore在下面指出的(+1),Hanson的“C接口和实现”是针对模块化架构的接口/实现设计的一个破解,并带有大量示例。 其实我听说过这本书,并且听到了好消息,虽然我不能宣称已经读过它。 除了我上面描述的C语言,这个概念可以说是良好的程序设计的核心。 事实上,Modula-2等其他过程语言实际上在设计中明确地表达了这个概念。 这可能是最接近“C程序体系结构”书籍的版本。

  • 阅读C FAQ。


  • 大卫汉森的“C接口和实现”解决了我从OO回到C的担忧。

    C接口和实现

    严肃地说,它的方法在避免意外建造许多非OO系统卷起来的大球纱方面发挥了巨大的作用。


    minix by tanenbaum

    链接地址: http://www.djcxy.com/p/13879.html

    上一篇: Resources for learning C program design

    下一篇: What is slower about dynamic memory usage?