2010-11-16 84 views
3

有没有人有关于如何以最佳方式构建C代码项目的技巧/资源? (不同的文件夹等)你怎么知道什么时候把代码分成单独的文件是好的?什么是一个好的Makefile的例子?构建C代码的技巧/资源?

我的项目是不那么大,但是我想开始在早期阶段构建我的代码..

回答

2

构建代码需要一定的经验,但大多是常识。

对于拆分代码,通常要求可读性:概念上相关的函数/数据类型应该放在同一个文件中。您可以将c标准库作为一个好例子。最好将数据结构定义和函数声明保存在不同的头文件中。这允许您将数据结构作为编译单元的一部分使用,即使您尚未定义所有功能。

提供类似功能的文件应该放在同一个目录中。避免深层目录结构(最好是1层深度)是很好的,因为这会使项目不必要地复杂化。

我认为Makefiles可以用于小型项目,但对于较大的项目会变得笨重。对于认认真真的工作(如果你想发布您的代码,创建一个安装等),你可能想看看CMake的,使用SCons等

看一看在GNU编码标准:http://www.gnu.org/prep/standards/standards.html

看gnu make一个简单的例子Makefile的手册。你也可以选择任何开源项目并查看Makefile。在sourceforge.net中浏览代码库可能会有用。

+0

如果你要谈论GNU标准,你应该提及'automake'。它节省了很多时间来制作符合标准的'Makefile's,并且它比CMake更好(当然,虽然不那么漂亮,但肯定更好)。 – 2010-11-16 20:34:10

+0

这是有争议的,看起来社区正在逐渐远离automake。我毫不怀疑gnu autotools对于许多项目多年来都非常有用,但是有更新的工具从中获得了经验: – subhacom 2010-11-17 06:44:19

+1

这里有一些链接:http://lwn.net/Articles/188693/和http ://www.scons.org/wiki/SconsVsOtherBuildTools和http://ubuntu-ky.ubuntuforums.org/showthread.php?t=976922 – subhacom 2010-11-17 06:51:17

0

这有时会被忽视,但安全性是大项目中的一个问题。这里有一些关于如何program securely的建议。

0

下面是一个成语我喜欢:

申报struct S IN的报头,使得它们的大小是由客户机代码已知的。然后将init和deinit函数声明为以下约定:

  • 第一个参数是struct foo*
  • 返回类型是struct foo*
  • 如果他们可能失败,最后一个参数是int*(最简单),enum foo_error*(如果有多种方式可能会失败,调用代码可能会关心)或GError**(如果您正在编写GLib样式的代码)。

foo_init()foo_deinit()回报NULL如果第一个参数是NULL。他们还返回第一个参数。

为什么这样呢?调用代码不必为结构分配堆空间,它可以放在堆栈上。如果您在堆中分配的,虽然,以下工作得很好:

struct foo* a_foo = foo_init(malloc(sizeof(*a_foo))); 
if (a_foo == NULL) { 
    /* Ruh-oh, allocation failure... */ 
} 
free(foo_deinit(a_foo)); 

一切都工作得很好,即使a_foo == NULLfoo_deinit被调用。