因为每个.c文件会被分别编译,如果你#include "xxx.c", xxx.c的内容在xxx.c里被编译一次,在包含它的文件里又被编译一次,这样不同的obj文件内就包含同样的函数定义,导致“符号重复”错误。
所以头文件只能包含声明性的东西,不能包含具体函数体
http://blog.vckbase.com/arong/archive/2004/05/28/294.aspx
这些我也是最近才弄明白,
之前我也知道#include "xx.cpp"不好, 但是有时多个文件都#include "a.h"还是会报错,告诉我重复编译了, 现在想清楚了
首先, 所有.cpp文件都不用被包含, 对它们系统是会分别编译的, 假设你自己写了一些字符串操作的函数, 放在MyString.h中, 而有两个cpp文件中有#include "MyString.h", 这时就会出错, 因为相同的函数被编译了两次.
正确的做法是MyString.h中只写 函数的声明, 新建第三个源文件MyString.cpp, 把函数的实现写在里面. 这些cpp文件里都加上#include "MyString.h",这样这些函数就没有被重复编译(只是多次被声明了).
总之, 头文件(.h)内只写函数声明,这样才能让里面的函数被多个源文件调用
#include
#include"math.h"
using namespace std;
class trigon
{
private:
float x,y,z;
public:
trigon(float a,float b,int c){x=a;y=b;z=c;}
trigon():x(0),y(0),z(0){}
~ trigon(){};
float Getgrith(){return x+y+z;}
float Getarea()
{
float s;
s=(x+y+z)/2;
return sqrt(s*(s-x)*(s-y)*(s-z));
}
};
void main()
{
float a,b,c;
char i='a';
while(1){
cout<<"输入三角形的三条边";
cin>>a>>b>>c; //三个数据之间要空格
if((a+b)>c&&(a+c)>b&&(b+c)>a)
{
trigon C(a,b,c);
cout<<"三边分别为"<
}
else
{
cout<<"你输入的三条边不能构成一个三角形"<
cout<<"退出请输入q"<
if(i=='q')
{
break;//退出循环
}
}
trigon C;
cout<<"默认的三角形的三边分别为0 0 0的三角形的周长面积如下:"<
}