转载:http://bbs.kaoyan.com/t4781100p1
头文件里是函数的声明,不是具体实现。
真正的实现文件,都是编译过的文件。
我们只能调用,没法看源代码,(编译过)
为什么要编译呢?
为了保密和利益啊,让你知道了源代码,厂家怎么混啊。
所以搞个头文件和实现文件。
那,他们最终是怎么编译在一起的。(请看编译原理{:soso_e120:})
先看代码://输入x,输出x的平方。
--------------------------------------------------------
//a.hpp
class A
{
public:
int square(int x);
};
---------------------------------------------------------
//a.cpp
#include <stdio.h>
#include "a.hpp"
int A::square(int x)
{
return x*x;
}
-----------------------------------------------------------------
//main.cpp
#include <stdio.h>
#include "a.hpp"
int main()
{
int i;
A a;
printf( "请输入数值x :" );
scanf("%d",&i);
printf("调用square()函数输出x的平方:%d\n",a.square(i));
return 0;
}
----------------------------------------------------------------------------
我是这样自圆其说的:
当main函数,(预编译时)预编译器遇到#include “a.hpp”了。
-----它就到a.hpp文件看一眼,发现是个class声明,它明白了。
-----接着往下走流程。(预编译,编译……)
-----到链接的时候链接器把main.cpp和a.cpp一起链接。
-----链接器为什么知道是a.cpp而不是其他文件呢?
-----因为a.cpp里面有#include “a.hpp”啊,
-----它就把a.hpp的内容和a.cpp的#include “a.hpp”替换,
-----然后把a.cpp里的内容和main.cpp的#include“a.hpp”替换,
-----就这么OK了。
一看便知:
a.hpp(声明文件)
|
#include “a.hpp”
/ \
main.cpp a.cpp(实现文件)
他们是通过#include “a.hpp”联系在一起的。
更简单大胆的自圆其说:
a.cpp的内容+a.hpp的内容,然后和main.cpp的内容加在一起,编译就ok了。