`

常用的代码组织形式(C语言)

阅读更多

    以下摘录自《Linux C 程序设计大全》。

    对于小型代码而言,可以将所有的文件书写在一个源文件中。但是如果代码量很大,这种组织代码的形式就不适合了。那么应当怎样组织多个文件,多个模块的大型代码呢?

    首先,应当将所有需要使用的函数分类。具体就是将功能相同的函数写在同一个文件内,在C语言中,一个文件即代表一个模块。例如,对于一个链表操作的程序而言,插入链表节点的操作函数和删除链表节点的操作函数操作的是同一个资源(链表),完成操作类似(都需要修改链表)。

    其次,如果模块中的函数是一个函数接口,需要被其他模块所引用,则应当定义为外部函数。如果函数仅在模块内使用,则应当定义为static函数(相当于Java中私有函数)。这样做可以防止各个模块中的函数因为重名现象而出现的错误。使用static关键字定义函数之后,只有本模块的函数可以对其进行调用。同理,仅在模块内使用的全局变量也应当定义为static。需要被其他模块引用的全局变量则应当使用默认方式定义。

    最后,定义一个common.h头文件,该头文件中包括以下内容:

    (1)头文件区:包含所有模块共同需要的头文件,例如常用的stdio.h,stdlib.h,unistd.h文件等。

    (2)全局宏区:包含所有模块公用的宏定义,例如调试开关,一些缓冲区的大小等。

    (3)全局变量区:包含所有非static全局变量的声明。

    (4)函数接口区:包含所有模块的函数接口。

    有了该common.h头文件后,各个模块的文件只要包含该头文件,就可以应用函数接口和全局变量,包含需要的头文件和宏定义。

 

    下面是一个经过组织的链表处理程序的代码。首先是common.h,该文件包含了所有的头文件,宏定义,全局变量的声明和函数接口的声明。

/* 头文件区 */
#include <stdio.h>
#include <stdlib.h>

/* 全局定义区,该程序没有用到宏,声明了一个结构体 */
typedef struct node * Node;  /* 自定义节点指针类型 */

/* 链表节点结构 */
struct node {
    int var;
    Node next;
};

/* 全局变量声明区 ,注意是声明不是定义 */

extern Node head;

/* 函数接口声明区 */
extern int insert(int var);
extern int del(int var, Node * res);
extern void print();
extern void destory();

     list.c文件定义所有操作链表的函数,该文件中没有用到static函数,所有的函数均作为接口提供给其他模块使用:

#include "common.h"

Node head; /* 链表头 */

/* 插入节点函数 */
int insert(int var) {

  // 省略具体代码实现
}

/* 删除节点函数 */
int del(int var, Node * res) {
   
    //省略具体代码实现
}

/* 遍历链表:打印每个节点 */
void print() {
    // ...
}

/* 遍历链表,释放每个节点 */ 
void destory() {
    // ....
}

     main.c文件定义main函数,该函数书写程序的执行流程:

#include "common.h"

int main() {

    //具体是实现省略

    return 0;
}

     调试开关:在调试程序时免不了需要输出一些当前程序执行的信息。当调试完毕之后,需要将这些输出信息去掉,这时可以使用C语言提供的条件编译的技术,将这些输出信息定义为宏。

分享到:
评论

相关推荐

    C语言标准库源代码.zip

    这里是C语言常用标准库函数源码的库,例如包括printf,sprintf,scanf,sscanf等函数实现的源码。源码的形式主要是.c,名称是大写,例如PRINTF.c,库的组织形式是很清晰的。

    c语言c++项目源代码_c语言课程设计-ktv歌曲系统.rar

    5. **数据存储**:系统将歌曲信息以文件形式存储,方便数据的备份和恢复。 **技术实现:** 项目采用C语言编写,利用文件操作实现对歌曲信息的管理和存储。通过结构体和数组等数据结构,高效地组织和管理歌曲数据。...

    c语言学生成绩管理系统

    通过模块化处理,将最初的程序的功能构想以函数的形式划分成几个模块,模块下再设子模块,一层一层直到程序的功能实现为止。这样,不仅程序易于编写,还易于维护。最重要的是,如果程序出错,还易于查找和修改。 ...

    你必须知道的495个C语言问题

     《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    C语言程序设计(PDF格式)

    目 录 序言 前言 第1章 程序设计与算法 1 1.1 程序设计语言的发展 1 1.2 C语言的特点 2 1.2.1 C语言是中级语言 2 1.2.2 C语言是结构化语言 3 ...附录A 常用字符与ASCII代码对照表 238 附录B 习题 239

    C语言程序设计(高清PDF)

    目 录 序言 前言 第1章 程序设计与算法 1 1.1 程序设计语言的发展 1 1.2 C语言的特点 2 1.2.1 C语言是中级语言 2 1.2.2 C语言是结构化语言 3 ...附录A 常用字符与ASCII代码对照表 238 附录B 习题 239

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Visual C++ 2010入门经典(第5版)》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2010入门经典(第5版) ... 8.8 组织程序代码 425 8.9 字符...

    [你必须知道的495个C语言问题].300dpi

    本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...

    495个C语言问题

    本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...

    《C语言程序设计》-PDF格式

    目 录 序言 前言 第1章 程序设计与算法 1 1.1 程序设计语言的发展 1 1.2 C语言的特点 2 1.2.1 C语言是中级语言 2 1.2.2 C语言是结构化语言 3 ...附录A 常用字符与ASCII代码对照表 238 附录B 习题 239

    你必须知道的495个C语言问题-高清完整带目录.pdf

    书目介绍:该书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的...

    简单的类c语言编译器,vj++编写 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的.zip

    简单的类c语言编译器,vj++编写 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

Global site tag (gtag.js) - Google Analytics