Linux 下真实的C项目设计
文件目录说明
- include 存放自己设计的.h头文件之所在
- include/stack.h 栈所使用的头文件。文件中已经定义出其包含的功能函数。具体请查看文件注释
- stack.c 栈的功能函数的实现文件。目前为空文件。
- main.c 一个简单的主程序,调用自定义栈的功能测试入栈、出栈的功能。
- Makefile make的控制文件。
实现Makefile
- 实现make命令完成所有编译、链接工作
- 实现make clean命令可以恢复代码为原始状态
运行结果
在windows下打开linux shell:
编译 链接,make一步到位(图中标号给出了文件生成的顺序):
我们看下makefile的内容:
代码语言:javascript复制main:main.o my_stack.o
gcc main.o my_stack.o -o main
main.o:main.c
gcc -c main.c
my_stack.o:my_stack.c
gcc -c my_stack.c
clean:
if [ -e main ] ; then rm main ; fi
if [ -n "ls *.o >/dev/null 2>&1" ] ; then rm *.o ; fi
make main 操作完成编译 链接
main.o 获得可执行文件main.o
my_stack.o 获得可执行文件mystack.o
make clean 操作删除所有已经编译的.o文件和main最终文件
接着来看main.c
代码语言:javascript复制#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "include/stack.h"
int main()
{
//测试手写的封装栈
stack_clear();//初始化栈
srand((unsigned)time(NULL));
elem buf;
for(int i=0;i<10;i )
{
buf = rand()0;
stack_push(buf);
printf("当前栈顶元素为:%dn",stack_top());
printf("栈是否为空(0为不空,1为空):%dn",stack_empty());
printf("当前栈的大小为:%dn",stack_size());
}
return 0;
}
main.c这部分代码是测试自己手写的封装栈,首先先初始化栈,接着for循环生成10个随机数,紧接着每次打印栈顶元素和栈的大小,顺带判断栈是否为空
再来看my_stack.c
代码语言:javascript复制#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "./include/stack.h"
Stack stack; //为了方便这里直接定义全局变量了,用局部变量的话在每个函数加上取地址符和声明就行了
void stack_pop(){ //元素出栈,此函数无返回值
stack.top--;
}
void stack_push(elem buf){ //元素入栈
stack.index[ stack.top] = buf;
}
int stack_empty(){//判空,如果栈为空的话返回1,否则返回0
return stack.top == -1;
}
void stack_clear(){ ///清空栈
stack.top = -1;
}
int stack_size(){ //求栈内元素数
return stack.top 1;
}
elem stack_top(){ //返回栈顶元素
return stack.index[stack.top];
}
my_stack.c是栈功能的实现函数,具体的实现内容则是根据大二上数据结构课程所学,这里就不再赘述
include 文件夹下 stack.h存放的则是一些预定义函数
代码语言:javascript复制#ifndef STACK_H_
#define STACK_H_
#define maxn 110//栈的最大值
typedef int elem;//方便修改数据类型
typedef struct
{
int top; //栈顶的索引
elem index[maxn];
}Stack;
void stack_pop(); //元素出栈,此函数无返回值
void stack_push(elem buf);//元素入栈
int stack_empty();//判空,如果栈为空的话返回1,否则返回0
void stack_clear();///清空栈
int stack_size(); //求栈内元素数
elem stack_top(); //返回栈顶元素
#endif
我们接着来看一下运行结果:
可以看到自己手写的栈功能运行正常,还没有出现大的bug~
测试一下make clean:
文件夹中的main main.o 已经stack.o都被删除了,makefile运行正常