包含头文件.h和.cpp文件问题

时间:2022-07-18 16:49:54
我用visual c++编写一个基本的数据结构的数据类型和实现方法
可我不明白的是:
我的抽象数据类型的基本操作定义在bo1-1.cpp时就是不能通过编译,提示是status没有定义
而我把抽象数据类型的基本操作定义在bo1-1.h时没有问题
到底两个定义有什么问题
而且在visual c++中的main()函数中可不可以有#include"bo1-1.cpp"这类型的包含出现呢???


下面是我的源码:

ch.h头文件:
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<process.h>
#include<iostream.h>
#include<sys/timeb.h>

//状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIABLE -1
//#define OVERFLOW -2

typedef int Status;
typedef int Boolean;

c1-1.h头文件:
typedef ElemType *Triplet; //Triplet 类型是ElemType 类型的指针,存放ElemType类型的地址

bo1-1.cpp文件:
///////////////////////////////////////////////////////////////
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)
{
if(!(T=(ElemType*)malloc(3*sizeof(ElemType))))
exit(OVERFLOW);
T[0]=v1;
T[1]=v2;
T[2]=v3;
return OK;
}
///////////////////////////////////////////////////////////////
Status DestroyTriplet(Triplet &T)
{
free(T);
T=NULL;
return OK;
}

///////////////////////////////////////////////////////////////
Status Get(Triplet T,int i,ElemType &e)
{
if(i<1||i>3)
return ERROR;
e=T[i-1];
return OK;
}

///////////////////////////////////////////////////////////////
Status Put(Triplet T,int i,ElemType e)
{
if(i<1||i>3)
return ERROR;
T[i-1]=e;
return OK;
}

///////////////////////////////////////////////////////////////
Status IsAscending(Triplet T)
{
return(T[0]<=T[1]&&T[1]<=T[2]);
}

//////////////////////////////////////////////////////////////
Status Max(Triplet T,ElemType &e)
{
e=T[0]>=T[1]?(T[0]>=T[2]?T[0]:T[2]):(T[1]>=T[2]?T[1]:T[2]);
return OK;
}

///////////////////////////////////////////////////////////////
Status Min(Triplet T,ElemType &e)
{
e=T[0]<=T[1]?(T[0]<=T[2]?T[0]:T[2]):(T[1]<=T[2]?T[1]:T[2]);
return OK;
}


MainData.cpp主函数:

typedef int ElemType;

#include "ch.h"
#include "c1-1.h"
#include "bo1-1.cpp"

//////////////////////////////////////////////////////////////
void main()
{
timeb t1,t2;
ftime(&t1);
Triplet T;
ElemType m;
Status i;
i=InitTriplet(T,5,7,9);
printf("调用初始化函数后,i=%d(1:成功,T的三个值为:",i);
for(int k=0;k<3;k++)
{
cout<<T[k]<<' ';
}
cout<<endl;
i=Get(T,2,m);
if(i==OK)
{
cout<<"T的第2个值为"<<m<<endl;
}
i=Put(T,2,6);
if(i==OK)
cout<<"将T的第二个值改为6后,T的3个值为"<<endl;
for(k=0;k<3;k++)
{
cout<<T[k]<<' ';
}
cout<<endl;
i=IsAscending(T);
printf("调用测试升序函数后,i=%d(0:否,1:是)\n",i);
if((i=Min(T,m)==OK))
cout<<"T中最小值为"<<m<<endl;
cout<<"销毁T前,T="<<T<<endl;
DestroyTriplet(T);
cout<<"销毁T后,T="<<T<<" NULL"<<endl;
ftime(&t2);
cout<<"用时为: "<<((t2.time-t1.time)*1000+(t2.millitm-t1.millitm))<<endl;


}

希望可以讨论下,在此谢谢各位先啦~~~~ 

12 个解决方案

#1


引用楼主 ekisstherain 的帖子:
我用visual c++编写一个基本的数据结构的数据类型和实现方法 
可我不明白的是: 
我的抽象数据类型的基本操作定义在bo1-1.cpp时就是不能通过编译,提示是status没有定义 
而我把抽象数据类型的基本操作定义在bo1-1.h时没有问题 
到底两个定义有什么问题 
而且在visual c++中的main()函数中可不可以有#include"bo1-1.cpp"这类型的包含出现呢??? 

把status的定义放到bo1-1.h的头文件中,并且把bo1-1.cpp文件中的所有函数的声明也放入bo1-1.h中.
不能采用#include"bo1-1.cpp"的形式出现!

#2


是读谭浩强的书入门的吧?

#3


#include "bo1-1.cpp" // 这个违背了头文件的用意,忘了它吧

#4


include一个.cpp文件是可以的,但是一般很少人这样做;
而且,编译和链接是两个概念,你用M$的编译器,它漂亮的界面隐藏了所有的细节,如果你要认真学习,建议使用gcc作编译器;

如果知道了编译器在界面后边做得事情,就不会有这种疑惑了:
如:
1)include一个.cpp文件:

//ss.hpp
void f();

//ss.cpp
#include "ss.hpp"
void f(){}

//main.cpp
#include "ss.cpp"
int main(){ f(); return 0; }

编译一下:
g++ -c main.cpp
链接成可执行文件
g++ -o main main.o

2)如果不include .cpp文件,这样编译链接:

//ss.hpp
void f();

//ss.cpp
#include "ss.hpp"
void f(){}

//main.cpp
#include "ss.hpp"
int main(){ f(); return 0; }

编译一下:
g++ -c main.cpp
g++ -c ss.cpp
链接成可执行文件
g++ -o main main.o ss.o

#5


include一个.cpp文件的缺点是,如果另外一个文件使用了f()这个函数,你会很尴尬
如果你的main函数中使用了一个函数g(),它可能不得不这样实现的:

void f();
void g(){ f(); }

而如果这样

#include "ss.cpp"
void g(){ f(); }

链接的时候你将得到一个重复定义f函数的错误。

#6


把声明都放在头文件,然后在源文件中包含需要的头文件。include一个cpp文件没有问题,但是一般不会这样做。

#7


#include"bo1-1.cpp"
楼主蛮有想法的,但是很遗憾,不可以这样。.cpp可以这样,那还要.h干嘛呢?

#8


新手,拜读了!

#9


引用 7 楼 hairetz 的回复:
#include"bo1-1.cpp" 
楼主蛮有想法的,但是很遗憾,不可以这样。.cpp可以这样,那还要.h干嘛呢?

呵呵,  #include"bo1-1.cpp"  是可以的。这样的例子见过,能编译。

但LZ 要尽量避免这样的写法,会有很多的潜伏的麻烦。

#10


引用 7 楼 hairetz 的回复:
#include"bo1-1.cpp" 
楼主蛮有想法的,但是很遗憾,不可以这样。.cpp可以这样,那还要.h干嘛呢?

呵呵,  #include"bo1-1.cpp"  是可以的。这样的例子见过,能编译。

但LZ 要尽量避免这样的写法,会有很多的潜伏的麻烦。

#11


谢谢各位的建议了...
不过,我在数据结构的书中看到有这样的形式的:#include"b01-1.cpp"这样的形式的
所以就提出来说下……
我用 #include "b01-1.h" 这样的形式当然没有问题了……
再向各位谢啦^_^ ……O(∩_∩)O哈哈~

#12


引用 2 楼 fallening 的回复:
是读谭浩强的书入门的吧? 


哈哈,当然读过他的书了……

#1


引用楼主 ekisstherain 的帖子:
我用visual c++编写一个基本的数据结构的数据类型和实现方法 
可我不明白的是: 
我的抽象数据类型的基本操作定义在bo1-1.cpp时就是不能通过编译,提示是status没有定义 
而我把抽象数据类型的基本操作定义在bo1-1.h时没有问题 
到底两个定义有什么问题 
而且在visual c++中的main()函数中可不可以有#include"bo1-1.cpp"这类型的包含出现呢??? 

把status的定义放到bo1-1.h的头文件中,并且把bo1-1.cpp文件中的所有函数的声明也放入bo1-1.h中.
不能采用#include"bo1-1.cpp"的形式出现!

#2


是读谭浩强的书入门的吧?

#3


#include "bo1-1.cpp" // 这个违背了头文件的用意,忘了它吧

#4


include一个.cpp文件是可以的,但是一般很少人这样做;
而且,编译和链接是两个概念,你用M$的编译器,它漂亮的界面隐藏了所有的细节,如果你要认真学习,建议使用gcc作编译器;

如果知道了编译器在界面后边做得事情,就不会有这种疑惑了:
如:
1)include一个.cpp文件:

//ss.hpp
void f();

//ss.cpp
#include "ss.hpp"
void f(){}

//main.cpp
#include "ss.cpp"
int main(){ f(); return 0; }

编译一下:
g++ -c main.cpp
链接成可执行文件
g++ -o main main.o

2)如果不include .cpp文件,这样编译链接:

//ss.hpp
void f();

//ss.cpp
#include "ss.hpp"
void f(){}

//main.cpp
#include "ss.hpp"
int main(){ f(); return 0; }

编译一下:
g++ -c main.cpp
g++ -c ss.cpp
链接成可执行文件
g++ -o main main.o ss.o

#5


include一个.cpp文件的缺点是,如果另外一个文件使用了f()这个函数,你会很尴尬
如果你的main函数中使用了一个函数g(),它可能不得不这样实现的:

void f();
void g(){ f(); }

而如果这样

#include "ss.cpp"
void g(){ f(); }

链接的时候你将得到一个重复定义f函数的错误。

#6


把声明都放在头文件,然后在源文件中包含需要的头文件。include一个cpp文件没有问题,但是一般不会这样做。

#7


#include"bo1-1.cpp"
楼主蛮有想法的,但是很遗憾,不可以这样。.cpp可以这样,那还要.h干嘛呢?

#8


新手,拜读了!

#9


引用 7 楼 hairetz 的回复:
#include"bo1-1.cpp" 
楼主蛮有想法的,但是很遗憾,不可以这样。.cpp可以这样,那还要.h干嘛呢?

呵呵,  #include"bo1-1.cpp"  是可以的。这样的例子见过,能编译。

但LZ 要尽量避免这样的写法,会有很多的潜伏的麻烦。

#10


引用 7 楼 hairetz 的回复:
#include"bo1-1.cpp" 
楼主蛮有想法的,但是很遗憾,不可以这样。.cpp可以这样,那还要.h干嘛呢?

呵呵,  #include"bo1-1.cpp"  是可以的。这样的例子见过,能编译。

但LZ 要尽量避免这样的写法,会有很多的潜伏的麻烦。

#11


谢谢各位的建议了...
不过,我在数据结构的书中看到有这样的形式的:#include"b01-1.cpp"这样的形式的
所以就提出来说下……
我用 #include "b01-1.h" 这样的形式当然没有问题了……
再向各位谢啦^_^ ……O(∩_∩)O哈哈~

#12


引用 2 楼 fallening 的回复:
是读谭浩强的书入门的吧? 


哈哈,当然读过他的书了……