如何构建您的c程序?

时间:2009-10-13 15:58:45

标签: c

我已经在C#/ Java中工作/编写了几年,所以基础知识等不会给我带来太多困难。 但我从来没有做过比c。

中的小型命令行学习程序更大的事情

现在我正在尝试为Linux制作手机模拟器,我不知道如何构建我的代码,而不是面向对象。 我有3本大书详细介绍了c,但没有一本涵盖如何编写更大项目的可维护性。

所以我希望你们中有些经验丰富的人可以指出我的最佳实践或类似的?

7 个答案:

答案 0 :(得分:7)

一些想法(这个问题应该是社区维基)

  • 即使它不是完全成熟的面向对象编程,也要坚持信息隐藏实践。让你的函数返回指向不透明结构的指针或句柄(unix文件句柄api是一个很好的(早期)示例。使用static函数,否则你会使用private方法。
  • 尝试将相关功能包含在单个文件中。这样可以更轻松地使用上述static关键字,并在将某些功能拆分为单独的文件时为您提供良好的指示。对于Java程序员来说,这不应该是一种奇怪的做法。
  • 适用评论的标准做法。如果您正在寻找类似于javadoc / C#XML注释的内容,请使用Doxygen之类的内容。
  • 如果你有一段时间没有做过任何严肃的事情,那么即使不是 hard 本身就要掌握保持记忆管理清洁和明智的做法,那就是比建立可维护性的做法更受伤害。只是一个警告。

答案 1 :(得分:2)

通常以相同的方式构建它。将事物分成几个文件,每个文件包含执行相关工作的代码。

通常使用C,您仍然可以考虑对象。但是,不是使用方法的类,而是在结构上运行的结构和函数。

答案 2 :(得分:2)

我建议将项目拆分为较小的组件,并将每个组件放在自己的.c和.h文件中。将代码放在.c文件中,将结构和原型放在.h文件中。

执行此操作,如果保持函数可重入,则可以在C中编程面向对象:假设有几个函数执行函数FOO,然后在 foo.c 中使用全局变量,声明 foo.h 中名为FOO的结构,并使函数将指向FOO结构的指针作为其第一个参数。

如果函数fred()仅用于 foo.c 中的某处,请将其标记为static,并且不要将原型放在 foo.h

此外,搜索Google codesearch以查看C项目是如何完成的。

答案 3 :(得分:1)

仅仅因为它的C并不意味着它不是面向对象的。请参阅this question或以“面向对象背景的学习C”的某些变体命名的任意数量的问题。

今天仍然使用这样的技术--GIMP建立在GTK+上,其中包含用于C语言中面向对象编码的GObject库。它可能不是最好的方法,也可能不是“惯用”C,但它可能对你有所帮助。

我对如何在大型项目中编写可维护性的其他建议是使用库。 C内置了很多,因此可以从便携式中挤出更多功能(开源?)第三方库,必须编写(因此维护)的代码越少。

GTK +再次拥有GLib,这是一个包含许多功能的全能库,人们发现自己在C中实现和重新实现.Apache有自己的Apache Portable Runtime,它做了很多事情相似(但具有不同类型的功能)。还有一些字符串库,它们可能会给你带来很多麻烦,还有一些特殊目的库(交互式提示的Readline,像vi这样的文本接口的Ncurses等)很有用,但可能不会发挥重要作用。你的特定应用。

最佳选择在某种程度上取决于您所写的内容。如果您正在编写操作系统内核或设备驱动程序或嵌入式系统的任何应用程序,请忽略上述所有建议。如果您正在寻求实现一种编程语言,请查看flex and bison以便在一些较小的测试项目上开始使用语法,但我建议您将自己的解析器和词法分析器用于一个严肃的项目(如果没有其他原因)改进的错误报告)。

答案 4 :(得分:0)

答案 5 :(得分:0)

一些建议......

•尽可能多地使用static修饰符;它(大部分)相当于OO语言中的private

•尽量不要使用太多的全局变量,特别是如果你的程序使用多个线程。

•将相关信息分组到structs;这些是你在C中的对象。

•C没有异常处理,因此请检查您调用的所有系统函数的返回值。

答案 6 :(得分:-1)

OO只是语法糖。最初的C ++编译器编译为C.这是Java和C中大致相同的类的基本示例:

Point.java
import java.lang.Math;

public class Point
{
    private int x, y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public int getDistance(Point p)
    {
        return Math.sqrt((p.x - this.x) * (p.x - this.x) + (p.y - this.y) * (p.y - this.y));
    }
}

Point.h
typedef struct __Point Point;
typedef struct __Point
{
    int x, y;
    int (*getDistance)(Point*,Point*);
} Point;

Point* new_Point(int, int);
void delete_Point(Point*);
int getDistance(Point*, Point*);

Point.c
#include <math.h>
#include "Point.h"

Point* new_Point(int x, int y)
{
   Point* this = malloc(sizeof(Point));
   this->x = x;
   this->y = y;
   this->getDistance = getDistance;
}

void delete_Point(Point* this)
{
    free(this);
}

int getDistance(Point* this, Point* p)
{
    return sqrt((p->x - this->x) * (p->x - this->x) + (p->y - this->y) * (p->y - this->y));
}