一个工程往往有头文件和cpp文件。那么什么是头文件,什么是include函数呢,我这里解释一下。
先看一段代码:
#include<iostream>
using namespace std;
void main()
{
printA();
printB();
}
void printA()
{
print('A');
}
void printB()
{
print('B');
}
void print(char x)
{
cout<<"this is "<<x<<endl;
}
这段代码编译是无法通过的,因为编译器找不到printA,printB,pirnt函数。所以我们需要引入大名鼎鼎的函数声明。即在开始的时候声明函数。
#include<iostream>
using namespace std;
/*这是函数声明*/
void printA();
void printB();
void print(char s);
/*这是函数实现*/
void main()
{
printA();
printB();
}
//printA的实现
void printA()
{
print('A');
}
//printB的实现
void printB()
{
print('B');
}
//print的实现
void print(char x)
{
cout<<"this is "<<x<<endl;
}
此时编译通过。可是很多的时候,我不仅这个main要用到printA,printB,print,而且其他的工程的main2也要用到这些函数,那么怎么办呢?我们自然的引入了头文件和include机制。include的实质是把某个文件追加在include的位置。
下面这段代码和第2段代码是一模一样的。注意,我说的是一模一样。
main文件:
#include<iostream>
using namespace std;
#include<print.h>
/*这是函数的声明,其实质是将include这句话用以下三句话替换。
理解!!!!!!!!!!!!!!!!!
void printA();
void printB();
void print(char s); */
/*这是函数实现*/
void main()
{
printA();
printB();
}
//printA的实现
void printA()
{
print('A');
}
//printB的实现
void printB()
{
print('B');
}
//print的实现
void print(char x)
{
cout<<"this is "<<x<<endl;
}
print.h文件是:
void printA();
void printB();
void print(char s);
这样,你就明白了include只是将头文件进行了替代,这和所谓的宏和内联函数是一样的。他只是进行了一下替代工作而已。
那么我们一般将不同的实现部分相分离,这样上面的完整代码应该是:
print.h
void printA();
void printB();
void print(char s);
main.cpp
#include<print.h>
/*这是函数实现*/
void main()
{
printA();
printB();
}
print.cpp:
#include<iostream>
using namespace std;
#include<print.h>
//printA的实现
void printA()
{
print('A');
}
//printB的实现
void printB()
{
print('B');
}
//print的实现
void print(char x)
{
cout<<"this is "<<x<<endl;
}
注意:print.cc和main.cc都用到了这些函数声明,所以都要嵌入.h,而main没有用到iostream中的cout,所以不需要嵌入iostream,而print用到了,所以需要嵌入。
先写到这。其实这就是所谓的实现和声明相分离,在同一个工程下,编译器首先只要有了声明就会留好入口,而连接的时候才去找实现。好了,先写到这里。永远记得,
将声明写在头文件中,将实现写在cpp中,替换嵌入的只能是h文件。#include <x.cpp>是将两个实现文件又搞在一起了,不仅没必要,而且很傻。