C/C++头文件
上节我们介绍了类型定义(typedef)。C++类型定义(typedef)
本节我们介绍头文件。
- 在一个团队里面共同开发时,代码通常在不同的文件中。另外一些共通的东西,例如宏定义,类型定义等都该放到不同的文件中。
什么是#include
-
预处理指令 - 编译前包含指定文件内容到当前文件中,即使用被包含文件替换源文件中的
#include
指令。 -
#include 指令有两种形式:
#include <iostream>
⬅文件名包含在尖括号中<标准系统目录>#include "test.h"
⬅文件名在双引号中<当前目录>
头文件的作用
-
代码重用:不同人写的相同作用的代码可能不同,为了防止组合在一起的时候浪费时间修改。
-
封装:把某些具有共性的函数定义放在同一个源文件里。
-
提高代码的可维护性
头文件的使用
-
此处写两个源文件(.cpp)并且包含相同的变量。
//testA.cpp #include <iostream> struct Position{ int x; int y; }; void testA(){ std::cout << "此处是testA" << std::endl; } //想要使用别的源文件的函数必须要声明 void testB(); int main(){ struct Position pos; pos.x = 10; pos.y = 10; testA(); testB(); return 0; } //testB.cpp #include <iostream> struct Position{ int x; int y; }; //函数前面除非带上static否者就是局部的函数,如果main函数所在的头文件不声明, 只在当前源文件有效 void testB(){ struct Position pos; pos.x = 10; pos.y = 10; std::cout << "此处是testB" << std::endl; }
输出结果:
此处是testA 此处是testB
上面的例子,两个源文件中的函数都是对外可见的(可以看见函数体)
-
另外当testA中结构体增加了新的变量,那么testB可能不知道,在之后的开发中可能会产生歧义。此时需要将共同的内容放到一个头文件中(.h)
//test.h #include <iostream> struct Position { int x; int y; }; //想要使用别的源文件的函数必须要声明 void testA(); void testB(); //testA.cpp #include <iostream> #include "test.h" //包含当前目录的头文件 void testA(){ std::cout << "此处是testA" << std::endl; } int main(){ struct Position pos; pos.x = 10; pos.y = 10; testA(); testB(); return 0; } //testB.cpp #include <iostream> #include "test.h" //包含当前目录的头文件 //函数前面除非带上static否者就是局部的函数,如果main函数所在的头文件不声明, 只在当前源文件有效 void testB(){ struct Position pos; pos.x = 10; pos.y = 10; std::cout << "此处是testB" << std::endl; }
上面把共同的结构体与函数声明放到了头文件中。效果相同,但是更加具有共通性,更加简洁。
保护措施
-
注意头文件不要相互包含,会导致编译失败!!
例如://testA.h #include <iostream> #include "testB.h" void testA(){ std::cout << "此处是testA" << std::endl; } //testB.h #include <iostream> //相互包含,TestA.h中也包含了TestB.h #include "testA.h" void testB()){ std::cout << "此处是testB" << std::endl; }
-
保护措施:(再头文件前面加上会让头文件只会被包含一次)
#pragma onece
()#ifndef ...
#define ...
#endif
//testA.h //只包含一次指令 #pragma once #include <iostream> void testA(){ std::cout << "此处是testA" << std::endl; } //testB.h //条件编译 #ifndef _TESTB_H_ #define _TESTB_H_ #include <iostream> void testB(){ std::cout << "此处是testA" << std::endl; } #endif //main.cpp #include <iostream> //由于#pragma once存在,头文件只包含一次 #include "testA.h" #include "testA.h" #include "testA.h" //由于条件编译指令存在,头文件只包含一次 #include "testB.h" #include "testB.h" #include "testB.h" int main(){ return 0; }
本节介绍了头文件。下节我们进入面向对象的编程。
转载:https://blog.csdn.net/qq_44989173/article/details/116504864
查看评论