首页 > 编程语言 >C++中头文件由来及使用细节

C++中头文件由来及使用细节

时间:2022-12-25 18:56:40浏览次数:43  
标签:头文件 函数 定义 C++ 源文件 由来 cpp 变量

  在刚学习C++的时候,无法一下子习惯头文件’ .h ’这个东西,因为在C#中,通常函数/变量的声明和实现都是写在一起的,跨.cs文件调用其他类成员时,编译器并不会冒出’ 未找到该变量或函数声明 ’的错误提示,我想,这正是微软在CLR中替我们封装的东西吧….

      

  事情时这样的…

  在C++中,如果要将代码变成可执行的.exe,大体需要两步,第一步是逐个编译.cpp源文件;第二步是将变量/函数的声明和定义链接(将当前.cpp文件和被调用的变量/函数定义所在的.cpp文件进行链接)。

  从这里可以发现,在进行第一步时,编译器是分别编译每一个.cpp源文件的。显然,这时如果当前源文件中调用了其他源文件中的变量/函数,则编译器就会找不到该变量/函数。于是我们就要在调用变量/函数之前声明该变量/函数,用于告诉编译器说这个变量/函数存在,具体的定义在其他源文件中。这时编译器就知晓了该变量/函数存在,便不会报出' 找不到变量/函数声明的错误 '。而在第二步时,编译器便会先搜索刚刚声明的变量/函数的定义在哪一个.cpp源文件中,找到后,将其和当前源文件链接起来,最终形成可执行程序。

       可以想象,如果在每个.cpp中都写上需要调用的变量/函数的声明,那程序员们就要直呼好家伙了。于是乎,大佬就统一规定了一个.h后缀的' 头文件 ',而后把变量/函数的声明写在头文件中。每当源文件中需要用这些声明时,#include "name.h"即可。

      

       基于刚刚分析过的内容,如果头文件中包含了定义,则在每一个引用了该头文件的源文件中就会都定义一次该变量/函数,即导致重复定义。

  所以下方关于头文件的规定,也看似理所应当

  1. 头文件中只允许存在变量/函数的声明,不能存在对其的定义。

  BUT!!!上面对头文件的认知,将在你接触到诸如CGAL的HeaderOnly库(他们整个库只包含头文件,不包含源文件)时招到冲击…

  为什么将变量/函数定义写在头文件中,却不会造成重复定义呢?在此之前你需要回顾一下inline这个关键字。

  头文件中,inline被称为内联函数修饰符,当函数加上inline修饰符后,该函数在被调用时,会自动复制函数定义到调用函数的cpp源文件中,而后,所谓的调用也只是调用当前cpp文件中的函数定义而已,所以不会造成重复定义。

  另外,若你在头文件中对类的成员函数进行定义,则编译器会为其自动加上inline修饰符,所以这种情况也不会导致重复定义。对于头文件中定义类模板、函数模板的情况,也同样不会导致重复定义。

 

  现在你也可以写一个HeaderOnly库了:

  1. 使用inline修饰头文件中的全局函数
  2. 使用类成员函数
  3. 使用类模板/函数模板

 

标签:头文件,函数,定义,C++,源文件,由来,cpp,变量
From: https://www.cnblogs.com/ShawBlack/p/17004370.html

相关文章

  • C++类模板、函数模板
    类模板的声明需要template<typename类型参数>,等于C#中的泛型类,如List<T>。template<typenameT>classComplex{public://构造函数Complex(Ta,Tb)......
  • Vscode c/c++环境
    最简单的环境,用vscode插件compilec/c++,只支持单个文件,不能调试,插件主页很短一看就懂单个文件我比较喜欢用命令行编译和运行/调试多个文件cmake/makefile mac调试-lld......
  • C++进阶(unordered_set+unordered_map模拟实现)
    unordered_setunordered_set是以无特定顺序存储唯一元素的容器,并且允许根据它们的值快速检索单个元素,是一种K模型。在unordered_set中,元素的值同时是它的key,它唯一地标......
  • C/C++ATM取存款机模拟程序
    C/C++ATM取存款机模拟程序ATM取存款机模拟程序要求:设计一个程序,当输入给定的卡号和密码(初始卡号和密码为123456)时,系统能登录ATM取款机系统,用户可以按照以下规则进......
  • C/C++特色家政服务管理系统
    C/C++特色家政服务管理系统30、特色家政服务管理系统【问题详述】家政公司针对新建住宅区推出“安心入住”清扫特色家政服务,为房主清扫新装修的住房,让房主能安心地搬入......
  • C/C++通讯录管理系统
    C/C++通讯录管理系统通讯录管理系统设计题目:通讯录管理系统设计实现功能:1.创建一个通讯录(单链表的创建)。2.显示通讯录中所有联系人的信息和按组显示具体组的联系人信息......
  • C++面向对象程序设计实训(实习)[2022-12-25]
    C++面向对象程序设计实训(实习)[2022-12-25]面向对象程序设计实训(实习)PracticalTrainingofObject-OrientedProgramming1、实习基本要求(1)学生自由组1人小组按照以下要......
  • Chapter.1 Extern | 我的变量怎么重复了? ——C++查漏补缺
    近期在学习C++,配合大牛书Primer看的效果还是很不错的。学到指针时又遇到了extern的使用,但自己回忆起来,好像在之前学过的内容里并没有对extern有非常深刻的印象。 于是结......
  • C++模板
    //-std=c++14//-O2//#pragmaGCCoptimize("Ofast")//next_permutation(a+1,a+1+n)#include<bits/stdc++.h>#definebintBigInteger#definehhputs("");#definey......
  • 基于qml创建最简单的图像处理程序(2)-使用c++&qml进行图像处理
     《基于qml创建最简单的图像处理程序》系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面课程1附件基于qml创建最简单的图像处理程序(2)-......