学习C程序devise资源

来自OO背景(C#/ java)我正在寻找资源来学习如何devise纯粹的C程序。

虽然我熟悉C的语法,而且我可以编写小程序,但是我不确定采用哪种方法来获取更大的应用程序,以及使用什么技术。 任何你可以推荐的东西。

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

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

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

如果你习惯了java,C程序的一些技巧是:

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

  2. C不会做垃圾回收,所以dynamic分配数据项目更加烦琐,你必须跟踪它们以确保它们被释放。 在栈上分配的variables(见1)在适用的地方更“惯用”。 另外,你不必释放他们 – 这是局部variables的奖金。

  3. 对(2)的适用,考虑一个架构,你的函数返回一个状态或错误代码,并按照(1)的方式使用栈传入和传出数据。

  4. 了解setjmp()longjmp()做什么的。 对于通用的error handling机制来说,它们可以用来代替结构化的exception处理function。

  5. C不支持exception。 参见(3)。

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

  7. 了解预处理程序的function,以及即使可以,也不应该使用它。

  8. 了解字节 排列 , 字alignment , 指针运算和其他低级架构奥秘的来龙去脉。 与stream行的观点相反,这些不是火箭科学。 如果您感觉敏锐,请尝试使用汇编语言,并掌握相关知识。 这对于你理解C程序中发生的事情将会有很大帮助。

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

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

  11. (10)适用于学习至less一种脚本语言(如Tcl , Lua或Python )的C API 。 在许多情况下,C的最佳使用是作为一个核心的高性能引擎在基本上写在别的东西上的应用程序。

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

  13. 大多数人认为匈牙利的符号和匈牙利文字一样可读。 匈牙利语为母语的人除外,匈牙利语通常认为匈牙利语的字母和楔形文字一样清晰。 。 不幸的是,匈牙利符号在Windows软件中被广泛使用,整个Win32 API都使用它,预计会在此平台上编写的软件的易读性受到影响。

  14. C / Unix书籍,甚至像W Richard Stevens所写的那些很好的书籍,往往可以通过Amazon marketplace以相当便宜的方式获得。 按照顺序排列,获得K&R, Stevens APUE和UNP 1 &2, 龙书, Rochkind, Programming Pearls, Petzold和Richter (如果在Windows上工作)以及任何其他经典C / Unix作品的副本。 阅读,用铅笔在他们上面涂写,通常与书籍互动。

  15. networking上有许多很好的C / Unix编程资源。

  16. 阅读和理解C编程的十诫,以及关于诫命背后的原因和理由的一些元讨论。 尽pipe其中的大部分仍然是相关的,模糊的编译器在embedded式系统领域仍然相当普遍 ,但它在某种程度上正在显示其年龄。

  17. Lex和Yacc是你的朋友,如果你想写parsing器。

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

  19. 阅读C FAQ 。

David Hanson的“C接口和实现”中讨论了从OO到C的问题。

C接口和实现

严重的是,它的方法在避免意外地build造许多非OO系统所缠绕的大纱线方面起了巨大的作用。

minix由tanenbaum

下面是关于C中OO编程的一个不同的问题的一些有趣的回答 。我提出了一些关于我使用的C代码的文章,基本上推动了面向对象的方向,而不包括虚拟方法。

如果我在做C编码,我会用这个技术来定义“对象”。

我发现保留devise模式总是有帮助的,并且可以用大多数语言来实现。

这里有一个很好的PDF讨论面向对象的C编程 。

更大的应用程序? 当你不得不面对诸如设备驱动程序,调度程序和其他操作系统风格的低级别事物时,C的优势就在于此。

你可以让C像OO一样运作,但是这样做很可能就像是在重新发明轮子的练习一样。

一个小问题就是将你的.c文件“向后”sorting – 即把main()放在文件的底部,并且总是确保本地函数(那些不在.h文件中的函数,在那个文件)住在他们第一次使用的地方之上。 这意味着你不必为他们编写原型,如果你不得不改变他们的API,那么这是一件小事。

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

虽然它被写成一种语言不可知的文本, Code Complete提供了许多有关代码结构和组织的良好指导以及构build实践。