用于学习C程序设计的资源

时间:2009-05-29 12:34:11

标签: c

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

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

编辑:我很乐意完全放弃OO用于C语言编程,我的兴趣是学习如何在没有OO的情况下构建程序,我想学习用程序语言设计程序的好方法,比如C语言

7 个答案:

答案 0 :(得分:49)

This posting有一个unix书籍列表,其中包括大多数经典的C / Unix作品。对于Windows上的C编程,Petzold的Programming Windows可能是最好的开始。

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

如果你已经习惯了java,那么C编程的一些技巧是:

  1. Make use of stack。通常在调用过程时,您需要在调用者的堆栈帧中分配变量,并将指针传递给您要调用的过程。这将比使用malloc()动态分配内存快得多,而且更不容易出错。在适当的地方这样做。

  2. C不执行garbage collection,因此动态分配数据项更加繁琐,您必须将它们跟踪到make sure they get freed.在堆栈上分配的变量(参见1)更多'惯用的'它们适用的地方。此外,您不必释放它们 - 这是本地变量的奖励。

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

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

  5. C does not support exceptions.见(3)。

  6. Lint是你的朋友。 Splint更加友善。

  7. 了解preprocessor做了什么以及不应该做什么,即使可以。

  8. 了解endian-nessword alignmentpointer arithmetic和其他低级建筑奥秘的细节。与流行观点相反,这些并不是火箭科学。如果你感觉很敏锐,可以尝试使用汇编语言,并掌握相关知识。它将帮助您了解C程序中发生的事情。

  9. C没有模块范围的概念,因此请计划使用包含,原型声明以及使用externstatic来制作私有范围和导入标识符。

  10. C中的GUI编程在all platforms.

  11. 上很乏味
  12. Apropos of(10)学习至少一种脚本语言的C API,例如TclLuaPython.在许多情况下,C的最佳用途是应用程序上的核心高性能引擎,基本上是用其他东西编写的。

  13. 构造函数的等价物是初始化函数,您可以在其中传入指向要设置的项目的指针。通常,您可以通过调用看起来像setup_foo(&my_foo)的函数的形式看到这一点。最好将分配与初始化分开,因为您可以使用此函数初始化已在堆栈上分配的项目。类似的原则适用于析构函数。

  14. 大多数人认为Hungarian notation与匈牙利语一样可读。例外的是匈牙利语母语人士,他们通常会发现匈牙利语符号与Cuneiform.一样易读。不幸的是,匈牙利语符号在Windows软件中被广泛使用,整个Win32 API使用它,预期会影响该平台上编写的软件的易读性。

  15. C / Unix书籍,即使是非常好的书籍,就像已故的理查德史蒂文斯写的那些,往往可以通过亚马逊市场以非常便宜的价格获得。没有特别的顺序,请获取K&R,史蒂文斯APUEUNP 1 & 2, Dragon book, Rochkind, Programming Pearls, {{3}的副本}和Petzold(如果在Windows上工作)和任何其他经典的C / Unix工作。阅读,用铅笔涂鸦,并与书籍互动。

  16. 网上有很多很好的Richter资源。

  17. 阅读并理解C/Unix programming以及关于诫命背后的原因和原因的一些元讨论。这在一定程度上显示了它的年龄,尽管其中大部分仍然相关且模糊不清的编译器仍然是Ten Commandments of C Programming

  18. 如果您想编写解析器,
  19. quite common in the embedded systems world是您的朋友。

  20. 作为Navicore Lex and Yacc,Hanson的points out below (+1)是关于模块化架构的接口/实现设计的破败,有大量示例。我实际上已经听过这本书并且听到了很多关于它的好消息,虽然我不能声称已经阅读过它。除了我上面描述的C语言之外,这个概念可以说是良好程序设计的核心。实际上,其他过程语言(如Modula-2)实际上在设计中明确表达了这一概念。这可能是最接近“C程序架构”的书籍。

  21. 阅读'C Interfaces and Implementations'

答案 1 :(得分:6)

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

C Interfaces and Implementations

说真的,它的方法在避免意外建造许多非oo系统结束的大型纱线方面产生了巨大的差异。

答案 2 :(得分:2)

这里有一些interesting responses来自另一个关于C语言中OO编程的问题。我发了一篇关于我工作过的C代码的文章,其中基本上是通过不包括虚方法来阻止对象导向的缩短。

如果我正在进行C编码,我会使用这种技术来定义'对象'。

我发现保持Design Patterns始终是有用的,并且可以在大多数语言中实现。

这是一篇很好的PDF讨论object oriented C programming

答案 3 :(得分:2)

minix by tanenbaum

答案 4 :(得分:1)

更大的应用程序? C的优势在于你必须处理诸如设备驱动程序,调度程序和其他操作系统风格的东西之类的低级别事物。

你可以使C像OO一样运作,但这将是一种重新发明轮子的练习......

答案 5 :(得分:1)

一个小问题是“向后”命令.c文件 - 即将main()放在文件的底部,并始终确保本地函数(不在.h文件中的函数,你只是写在该文件中使用)住在他们第一次使用的地方。这意味着你不必为它们编写原型,如果你不得不改变他们的API,那就少了一件事。

然后,作为奖励,vim中的'gD'命令将始终转到函数的定义,如果它在同一个文件中:)

答案 6 :(得分:0)

虽然它是一个与语言无关的文本,Code Complete提供了很多关于代码结构和组织以及构建实践的良好指导。