随笔,主要是给自己看的.内容可能不甚详细.
头文件即.h文件一般是用来写函数或者类的定义的,而函数的实现一般在cpp文件中完成.但是我也看到过一些文件就在头文件中同时定义函数和实现.打个比方我现在有个头文件名叫header.h
,内容如下
#include <iostream>
void printInt(int number){
std::cout<<"print an int number "<<number<<std::endl;
}
这个头文件同时定义与实现了这个函数.似乎不像是头文件的功能,但是这是允许的.那么这会不会造成什么问题呢?会的.如果你有两个文件同时包含了这个头文件并一起编译,就会有error产生.
比如,你有一个cpp文件叫main.cpp,一个cpp文件叫test.cpp,两个文件都包含头文件header.h,里面实现了某个内容.编译时(这里使用CMakeLists.txt的语法作为例子)我们一起编译这两个文件
add_executable(main main.cpp test.cpp)
就会出现问题.给出的错误是...multiple definition...
.这个原因是test.cpp和main.cpp实现并定义了函数printInt,所以有重复定义.但这个问题很有意思的是如果你把函数写到类中,如下面
#include <iostream>
class Print{
void printInt(int number){
std::cout<<"print an int number "<<number<<std::endl;
}
};
则同样被两个文件包含,同样的编译,却不会出现error能正常编译.
更有意思的是,我们经常喜欢在类外实现函数定义,即头文件改成如下面的这个样子
#include <iostream>
class Print{
void printInt(int number);
};
void Print::printInt(int number){
std::cout<<"print an int number "<<number<<std::endl;
}
再重复上面的步骤编译,又会出现同样的multi definition的error了.
在头文件的实现中,有两种语法,即使实现了函数且被重复包含,也是不会出错的.一个是模版.模版需要定义和实现必须写在一起,无论是写在头文件还是cpp文件中.第二种是内联inline函数.即利用下面语句定义的函数.
inline function_type function_name(){...}
个人想法是,除非用hpp文件(个人其实不经常使用)或者写模版内联函数,函数或者类的定义和实现还是分开在头文件和cpp源文件中写更好了.第一是代码清晰好读,第二是就算是函数写在类中实现没有大的问题,有经验的程序猿知道我们debug时头文件中函数实现部分的修改会导致包含头文件的所有文件重新编译,编译会耗时更长.分开写的画就算在debug时我们改变函数内容,也只会影响很少一部分.(好像说得完全不清楚....大家自己去网上查啦).