构建C代码的提示/资源?

时间:2010-11-16 10:38:51

标签: c makefile directory-structure

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

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

4 个答案:

答案 0 :(得分:2)

构建代码需要一些经验,但主要是常识。

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

提供类似功能的文件应位于同一目录中。最好避免深层目录结构(最好是1级深度),因为这会不必要地构建项目变得复杂。

我认为Makefiles适用于小型项目,但对于大型项目则变得笨拙。对于非常认真的工作(如果你想分发代码,创建安装程序等),你可能想看看cmake,scons等。

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

查看gnu make手册,了解一个简单的Makefile示例。您还可以选择任何开源项目并查看Makefile。浏览sourceforge.net中的代码存储库可能很有用。

答案 1 :(得分:1)

阅读互联网上提供的众多C编码标准之一,并按照符合您要求的标准进行操作。一些链接:

以下书籍还包含有关编写优秀C代码的有效指南:

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是我喜欢的习语:

在标头中声明struct s,以便客户端代码知道它们的大小。然后将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,所有内容都能正常运行。

相关问题