1. C++中头文件(.h)和源文件(.cpp)都应该写些什么:
总结下来就是头文件写的就是类的声明(包括类里面的成员和方法的声明)和函数的声明,但一般来说不写出具体的实现。对应的同名(可以不同名,但出于编程习惯最好同名)源文件来写出具体的实现,当然这个实现的源文件里必须要include对应的头文件,这样能保证声明和定义对应实现完整性,这是因为编译器在编译代码时,只会去编译.cpp格式的源文件,并且预编译器会递归的把.cpp所有#include的头文件都“拷贝”到.cpp文件中去。然后main文件或者其他文件如果想要调用实体时(比如变量或函数)只用include相应的头文件,因为变量在使用前就要被定义或者声明,这里即指只用声明即可,因为编译器会在链接时去找对应的声明的实现。
https://blog.csdn.net/lyanliu/article/details/2195632
2. 在写头文件时在开头和结尾处必须按照如下样式加上预编译语句#ifndef #define endif,有什么作用?
https://blog.csdn.net/qq_45507472/article/details/117928374?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-117928374-blog-80727293.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-117928374-blog-80727293.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=2
3. 命名空间和头文件的区别与联系
1)命名空间一般是放在头文件中的:
2)想要在头文件对应的源文件里实现命名空间mine中的display()函数,则必须采用下图一的void mine::display()实现方式。不能在mine.cpp中直接加using namespace mine来实现,然后直接实现display()这个函数,因为这样操作的话其实有个歧义,就是在mine.cpp中,这个display函数的定义到底是属于mine命名空间的还是不属于任何命名空间的一个函数呢? 所以这样是会报错的。
4.C++中内部链接和外部链接,编译器如何根据头文件来找到相应实现的cpp文件?
1)什么是内链接和外链接:我们知道,其实编译器在编译代码时,只会去编译.cpp格式的源文件,并且预编译器会递归的把.cpp所有#include的头文件都“拷贝”到.cpp文件中去,之后对这个文件再进行编译,生成二进制的.obj文件。那么其实每一个.cpp文件都是一个编译单元。每个编译单元是独立,互相看不到对方,是通过链接器才能产生关联。在这里首先要知道清楚声明和定义的区别,声明:用于向程序表明变量或函数的类型和名字。定义:用于为变量和函数分配存储空间,还可为变量指定初始值。在一个程序中,变量或函数只能定义一次,却可以声明多次。(定义也是声明:当定义变量时我们声明了它的类型和名字)。内链接就是那些编译单元(.cpp)中不能向其他编译单元(.cpp)展示提供其定义的函数、变量。那么这个实体(比如变量或函数)就拥有内部链接。外链接的定义就恰好相反,一个多文件的程序中,一个实体可以在链接时与其他编译单元交互,那么这个实体就拥有外部链接。换个说法,那些编译单元(.cpp)中能向其他编译单元(.cpp)提供其定义,就说这些实体拥有外部链接。
https://blog.csdn.net/isscollege/article/details/73851795
2)编译器不管头文件的,所以头文件和源文件取名不一样也没关系,头文件只是用来被cpp文件包含的,被包含之后,它就成了那个cpp文件的一部分了,而编译器只编译.cpp文件,不会去单独编译一个头文件的。编译器这样做之后,针对每个编译过的cpp文件生成一个obj文件。然后链接器把所有这些obj文件链接成一个程序或者是exe或dll(或做成静态的lib)。如果在链接的过程中,有些实体(比如变量或函数)找不到定义,则会报link错误,这还没完,链接的时候也会检查,比如某个函数f在不同的cpp文件中出现了多次定义,而且都是外链接,那链接器也会报重复定义地错误。
3)对于模板,声明和定义都要写在一起放在头文件。