来自OO背景(C#/ java)我正在寻找资源来学习如何很好地设计纯C程序。
虽然我熟悉C的语法,并且我可以编写小程序,但我不确定采用更大应用程序的方法,以及采用何种技术。你们可以推荐的任何东西。
编辑:我很乐意完全放弃OO用于C语言编程,我的兴趣是学习如何在没有OO的情况下构建程序,我想学习用程序语言设计程序的好方法,比如C语言答案 0 :(得分:49)
This posting有一个unix书籍列表,其中包括大多数经典的C / Unix作品。对于Windows上的C编程,Petzold的Programming Windows可能是最好的开始。
对于C程序设计,一些unix编程书会告诉你片段,但我不知道“C程序架构”一书。
如果你已经习惯了java,那么C编程的一些技巧是:
Make use of stack。通常在调用过程时,您需要在调用者的堆栈帧中分配变量,并将指针传递给您要调用的过程。这将比使用malloc()
动态分配内存快得多,而且更不容易出错。在适当的地方这样做。
C不执行garbage collection,因此动态分配数据项更加繁琐,您必须将它们跟踪到make sure they get freed.在堆栈上分配的变量(参见1)更多'惯用的'它们适用的地方。此外,您不必释放它们 - 这是本地变量的奖励。
(2)的应用,考虑一种体系结构,其中函数返回状态或错误代码,并按照(1)使用堆栈传入和传出数据。
了解preprocessor做了什么以及不应该做什么,即使可以。
了解endian-ness,word alignment,pointer arithmetic和其他低级建筑奥秘的细节。与流行观点相反,这些并不是火箭科学。如果你感觉很敏锐,可以尝试使用汇编语言,并掌握相关知识。它将帮助您了解C程序中发生的事情。
C中的GUI编程在all platforms.
Apropos of(10)学习至少一种脚本语言的C API,例如Tcl,Lua或Python.在许多情况下,C的最佳用途是应用程序上的核心高性能引擎,基本上是用其他东西编写的。
构造函数的等价物是初始化函数,您可以在其中传入指向要设置的项目的指针。通常,您可以通过调用看起来像setup_foo(&my_foo)
的函数的形式看到这一点。最好将分配与初始化分开,因为您可以使用此函数初始化已在堆栈上分配的项目。类似的原则适用于析构函数。
大多数人认为Hungarian notation与匈牙利语一样可读。例外的是匈牙利语母语人士,他们通常会发现匈牙利语符号与Cuneiform.一样易读。不幸的是,匈牙利语符号在Windows软件中被广泛使用,整个Win32 API使用它,预期会影响该平台上编写的软件的易读性。
C / Unix书籍,即使是非常好的书籍,就像已故的理查德史蒂文斯写的那些,往往可以通过亚马逊市场以非常便宜的价格获得。没有特别的顺序,请获取K&R,史蒂文斯APUE和UNP 1 & 2, Dragon book, Rochkind, Programming Pearls, {{3}的副本}和Petzold(如果在Windows上工作)和任何其他经典的C / Unix工作。阅读,用铅笔涂鸦,并与书籍互动。
网上有很多很好的Richter资源。
阅读并理解C/Unix programming以及关于诫命背后的原因和原因的一些元讨论。这在一定程度上显示了它的年龄,尽管其中大部分仍然相关且模糊不清的编译器仍然是Ten Commandments of C Programming。
作为Navicore Lex and Yacc,Hanson的points out below (+1)是关于模块化架构的接口/实现设计的破败,有大量示例。我实际上已经听过这本书并且听到了很多关于它的好消息,虽然我不能声称已经阅读过它。除了我上面描述的C语言之外,这个概念可以说是良好程序设计的核心。实际上,其他过程语言(如Modula-2)实际上在设计中明确表达了这一概念。这可能是最接近“C程序架构”的书籍。
答案 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提供了很多关于代码结构和组织以及构建实践的良好指导。