Sample code compilation run environment :Windows 64bits+VS2017+Debug+Win32.
The header file is C/C++ An integral part of the process , In use , You should understand the role of header files and related specifications .
<>1. The role of header files
C/C++
Separate compiling mode is adopted . In a project , More than one source file exists , But they always have something in common , For example, user-defined types , global variable , Declaration of global functions, etc . Extract the contents and put them in the header file , Provide each source file with , It can avoid repeated writing of the same content , Improve programming efficiency and code security . therefore , The main purpose of the header file is to : Provide global variables , The declaration of a global function or the definition of a common data type , So as to separate compilation and code reuse .
In a nutshell , The header file has the following three functions :
(1) Strengthen type inspection , Improve type security .
Use header file , It can effectively ensure the consistency of custom types . although , In grammar , Same data type ( Like a class) Writing multiple times in different source files is allowed , Programmers think they are the same custom type , however , Because the data type does not have an external connection property , The compiler does not care about consistency between multiple versions of the type , This may lead to logical errors . The following procedures were examined .
//source1.cpp #include <iostream> class A { private: char num; public: A();
void show(); }; void A::show(){std::cout<<num<<std::endl;} void see(A&
a){a.show();} //end source1.cpp //source2.cpp #include <iostream> class A {
private: int num; public: A(){num=5;}; void show(); }; void see(A& a); int
main() { A a; see(a); } //end source2.cpp
This program can be successfully compiled and run correctly , In the two source files that make up the project , Yes class
A There is a slight inconsistency in the definition of . In both source files , Member variable num One is char type , One is int type , This results in the output of a special character .
If class A In a header file , be used class A All of the source files contain this header file , It can absolutely guarantee the consistency and security of data types .
(2) Reduce duplication of common code , Improve programming efficiency .
In the process of program development , It is inevitable to modify some data types or interfaces , Use header file , Just modify the contents of the header file , This ensures that the changes take effect in all source files , So as to avoid tedious and error prone repeated modification .
(3) Provide means of confidentiality and code reuse .
So is the header file C++ An indispensable means in code reuse mechanism , On many occasions , Source code inconvenience ( Or not ) Publish to users , Just provide the user with the header file and binary library . The user only needs to call the library function according to the interface declaration of the header file , You don't have to care about the concrete implementation of the interface , The compiler connects the corresponding implementation code from the library .
<>2. Usage of header file
<>2.1 Content of header file
The header file contains the common content of multiple source files , therefore , Global function prototype declaration , Global variable declaration , Custom macros and types should be placed in the header file . The header file of the specification is allowed to be included by multiple source files without causing compilation errors , So the definition of global variables , Definition of external variables , Definition of global function , The definition of class member functions outside the class body that can only appear once should not be placed in the header file .
<>2.2 Use the header file provided by the system
C The header files provided by the .h Ending , Such as standard library header file stdio.h etc .C++ The original purpose of language is to be a “ better C”, therefore C++ The language is still in use C
Naming conventions of language header files , Add header file after .h sign . along with C++ Language development ,C++ A new standard library has been added , In order to avoid C There is a conflict ,C++
Name space is introduced to avoid name conflict , The header file is also removed .h suffix . therefore , For a while , Many header files have two versions , One with .h
ending , The other is not , as iostream.h( In global namespace ) and iostream( In the namespace std). Programmers have different options for programming , quite a lot C++
The source program begins with such a statement :
#include <iostream.h>
And others , Start with these two statements :
#include <iostream> using namespace std;
This phenomenon is somewhat confusing , therefore C++ Standards Committee regulations , used C Header file ( as stdio.h) and C++ Zhongxin C Header file ( as cstdio) Continue to use , But the old one C++
Header file ( as iostream.h) It has been abandoned , All adopted C++ Header files specified in the new standard ( as
iostream). in addition , When the system header file is included , Should be used <>( Angle brackets ) instead of ””( Double quotation marks ). For example, you should include the header file like this iostream:
#include <iostream>
It's not like this :
#include “iostream”
Double quotation marks ”” Used to contain custom header files , It is a bad programming habit to use it to include system header files . The reason is that the compiler encountered a header file wrapped in double quotation marks, which is the user-defined header file by default , Search from project directory , If you can't find it, you will find it in the system directory , If there is a user-defined header file with the same name as the system header file , Errors that do not meet expectations will occur .
<>2.3 Avoid repeated inclusion of header files
C/C++
in , Such as the definition of global variables , The definition of global functions can only appear once in a project . Some can appear many times , But it can only appear once in a source file , as class And so on , Others can appear more than once in a source file , Such as function declaration . The content of the header file cannot be determined in advance , You should avoid including the same header file more than once in a source file , In order to avoid redefinition errors . The following procedures were examined .
//header1.h class A { int num; public: A(); void show(); }; //end header1.h
//header2.h #include “header1.h” class B { A a; public: void disp(); }; //end
header2.h //main.cpp #include <iostream> #include “header1.h” #include
“header2.h” A::A() { num=5; } void A::show(){std::cout<<num<<std::endl;} int
main() { A a; a.show(); } //end main.cpp
This program cannot be compiled , as a result of class A In the source file main.cpp Is defined twice , This is due to the header file header2.h Contains
header.1, In the source file main.cpp Contains header2.h, It also includes header1.h, This leads to header1.h stay main.cpp
It's included twice , That's what happened class A Repetitive definition .
It is common for a header file to be repeatedly included by another source file , How to avoid repeated inclusion of a header file ? Easy solution with conditional compilation . Add at the beginning of the header file :
#ifndef HEADER_NAME #define HEADER_NAME
Add at the end of the header file :
#endif
HEADER_NAME
Can be any content , As long as the current header file can be uniquely identified , The name of the header file is recommended . Add these conditional compilation preprocessing instructions to the two header files in the sample program above , The problem can be solved . in addition , It can also be used
#paragma once Preprocessing instructions , But this method is not supported by all compilers , Considering the portability of the code , Conditional compilation preprocessing instructions are recommended .
Read the sample code above , The following points need to be noted :
(1) Conditional compilation instruction #ifndef HEADER_NAME and #endif It means : If the conditional compilation flag HEADER_NAME If there is no definition , Then compile #ifndef
and #endif Between the program segments , Otherwise, ignore it . Header file header1.h Just be included once , Conditional compilation flag macro HEADER_NAME Will be defined , So it won't be included again .
(2)iostream Is the header file in the standard library , So use angle brackets when included <>, and header1.h and header2.h
Is a user-defined header file , Use double quotation marks when included .
<> reference
[1] Chen Gang .C++ Advanced course [M]. Wuhan : wuhan university press ,2008.C2-10 About header files .P82-87
Technology