(面向过程)c或者c++的头文件到底该放些什么东西?

如果是子函数的声明,那么我在主函数里写成:#include"xxx.c" 为什么不好?(肯定可以). ps:我也想将自己的代码规范些,所以请各位达人尽可能详细的解说下:1.头文件放些什么 2.为什么要这么做 3.重复包含是啥情况,如何避免。。。。。。。。感激不尽

因为每个.c文件会被分别编译,如果你#include "xxx.c", xxx.c的内容在xxx.c里被编译一次,在包含它的文件里又被编译一次,这样不同的obj文件内就包含同样的函数定义,导致“符号重复”错误。
所以头文件只能包含声明性的东西,不能包含具体函数体

http://blog.vckbase.com/arong/archive/2004/05/28/294.aspx
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-05
这些我也是最近才弄明白,
之前我也知道#include "xx.cpp"不好, 但是有时多个文件都#include "a.h"还是会报错,告诉我重复编译了, 现在想清楚了
首先, 所有.cpp文件都不用被包含, 对它们系统是会分别编译的, 假设你自己写了一些字符串操作的函数, 放在MyString.h中, 而有两个cpp文件中有#include "MyString.h", 这时就会出错, 因为相同的函数被编译了两次.
正确的做法是MyString.h中只写 函数的声明, 新建第三个源文件MyString.cpp, 把函数的实现写在里面. 这些cpp文件里都加上#include "MyString.h",这样这些函数就没有被重复编译(只是多次被声明了).
总之, 头文件(.h)内只写函数声明,这样才能让里面的函数被多个源文件调用
第2个回答  2011-12-05
#include<iostream>
#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<<"三边分别为"<<a<<" "<<b<<" "<<c<<"的三角形的周长面积如下:"<<endl<<"周长:"<<C.Getgrith()<<endl<<"面积"<<C.Getarea()<<endl;

}
else
{
cout<<"你输入的三条边不能构成一个三角形"<<endl;
}
cout<<"退出请输入q"<<endl;
cin>>i;
if(i=='q')
{
break;//退出循环
}
}

trigon C;
cout<<"默认的三角形的三边分别为0 0 0的三角形的周长面积如下:"<<endl<<"周长:"<<C.Getgrith()<<endl<<"面积"<<C.Getarea()<<endl;

}
相似回答