1头文件
所谓的头文件,其实它的内容跟 .cpp 文件中的内容是一样的,都是 C++ 的源代码。但头文件不用被编译。我们把所有的函数声明全部放进一个头文件中,当某一个 .cpp 源文件需要它们时,它们就可以通过一个宏命令 "#include" 包含进这个 .cpp 文件中,从而把它们的内容合并到 .cpp 文件中去。当 .cpp 文件被编译时,这些被包含进去的 .h 文件的作用便发挥了。
想要包含头文件中的代码我们需要使用#include
调用标准库函数我们可以用<>
#include <stido.h>
调用本地文件的函数可以用""
#include "my.h "
2头文件如何来关联源文件
在程序运行的时候,链接阶段会把所有的文件连在一起。
.h文件中能包含:
- 类成员数据的声明,但不能赋值
- 类静态数据成员的定义和赋值,但不建议,只是个声明就好。
- 类的成员函数的声明
- 非类成员函数的声明
- 常数的定义:如:constint a=5;
- 静态函数的定义
- 类的内联函数的定义
不能包含:
- 1. 所有非静态变量(不是类的数据成员)的声明
- 2。 默认命名空间声明不要放在头文件,using namespace std;等应放在.cpp中,在 .h 文件中使用 std::string
对于初学者来说,想要实现多文件操作,我们只需记住,头文件里写入的是其他源文件的代码的声明
例如,写一段简单的代码
main.c文件
#include<stdio.h>
#include"math.h"
int main()
{
int a = 10;
int b = 20;
printf("max=%d\n", max(a, b));
printf("min=%d\n", min(a, b));
}
math.h 文件
#pragma once
#ifndef MATH_H
#define MATH_H
int max(int x, int y);
int min(int x, int y);
#endif // !MATH_H
math.c文件
int max(int x, int y)
{
return x > y ? x : y;
}
int min(int x, int y)
{
return x < y ? x : y;
}
头文件的意义在于,当一个文件想要调用另一个文件的代码时,避免了重新打一边代码,更加的快捷,方便。
3嵌套文件包含
我们已经知道,
#include
指令可以使另外一个文件被编译。就像它实际出现于
#include
指令的
地方⼀样。
这种替换的方式很简单:预处理器先删除这条指令,并用包含⽂件的内容替换。
⼀个头文件被包含10次,那就实际被编译10次,如果重复包含,对编译的压力就比较大。
test.h
void test();
struct Stu
{
int id;
char name[20];
};
test.c
#include<test.h>
#include<test.h>
#include<test.h>
#include<test.h>
#include<test.h>
int main ()
{
return 0;
}
如果直接这样写,test.c⽂件中将test.h包含5次,那么test.h⽂件的内容将会被拷⻉5份在test.c中。
如果test.h ⽂件⽐较⼤,这样预处理后代码量会剧增。如果⼯程⽐较⼤,有公共使⽤的头⽂件,被⼤家
都能使⽤,⼜不做任何的处理,那么后果真的不堪设想。
如何解决头⽂件被重复引⼊的问题?
答案:条件编译。
每个文件开头这样写
#ifndef __TEST_H__
#define __TEST_H__
#endif
或者
#pragma once