C++中头文件(.h)和源文件(.cpp)都应该写些什么,头文件中的预编译语句作用,命名空间和头文件的区别与联系,内部链接和外部链接

  • Post author:
  • Post category:其他



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命名空间的还是不属于任何命名空间的一个函数呢? 所以这样是会报错的。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


https://blog.csdn.net/jyx1572676601/article/details/121719373?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%20%E5%A4%B4%E6%96%87%E4%BB%B6&utm_medium=distribute.pc_search_result.none-task-blog-2

all

sobaiduweb~default-1-121719373.142

v33

pc_rank_34,185

v2

tag_show&spm=1018.2226.3001.4187


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)对于模板,声明和定义都要写在一起放在头文件。



版权声明:本文为Rolandxxx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。