• C++-头文件书写规范(二):头文件中的保护措施【#ifndef #define...#endif 】【防止多个源文件同时包含同一个头文件时产生的声明冲突】


    .h头文件中,只能存在变量、函数、类的声明, 而不要放定义。即:

    • 只能在头文件中写形如下的句子,这些才是声明:
      • extern int a;
      • void f();
    • 如果写上int a;或者void f() {}这样的句子,那么一旦这个头文件被两个或两个以上的.cpp文件包含的话,编译器会立马报错。(关于extern,前面有讨论过,这里不再讨论定义跟 声明的区别了。)
       

    但是,这个规则是有三个例外的。

    1.  头文件中可以写const、static对象的定义;
    2. 头文件中可以写内联函数(inline)的定义;
    3. 头文件中可以写类(class)的定义

    考虑一下,如果头文件中只包含声明语句的话,它被同一个.cpp文件包含再多次都没问题——因为声明语句的出现是不受限制的。

    然而,上面讨论到的头文件中的三个例外也是头文件很常用的一个用处。

    那么,一旦一个头文件中出现了上面三个例外中的任何一个,它再被一个.cpp包含多次的话,问题就大了。因为这三个例外中的语法元素虽然“可以定义在多个源文件中”,但是“在一个源文件中只能出现一次”。

    设想一下,如果a.h中含有类A的定义,b.h中含有类B的定义,由于类B的定义依赖了类A,所以b.h中也#include了a.h。现在有一个源文件,它同时用到了类A和类B,于是程序员在这个源文件中既把 a.h包含进来了,也把b.h包含进来了。这时,问题就来了:类A的定义在这个源文件中出现了两次!于是整个程序就不能通过编译了。

    你也许会认为这是程序 员的失误——他应该知道b.h包含了a.h——但事实上他不应该知道。

    使用”#define”配合条件编译可以很好地解决这个问题。

    头文件中的 #ifndef 是一个很关键的东西。

    #ifndef的作用:防止多个源文件同时包含同一个头文件时产生的声明冲突。在一个头文件中,通过 #define 定义一个名字,并且通过条件编译 #ifndef...#endif 

    一般格式:

    1. #ifndef <标识>
    2. #define <标识>
    3. ...
    4. ...
    5. #endif

    使得编译器可以根据这个名字是否被定义,再决定要不要继续编译该头文中后续的内容。

    <标识> 在理论上来说可以是自由命名的,但每个头文件的这个<标识>都应该是唯一的。标识的命名规则一般是:

    • 头文件名全大写,前后加下划线,
    • 并把文件名中的“.”也变成下划线,

    这个方法虽然简单,但是写头文件时一定记得写进去。

    如:stdio.h:

    1. #ifndef _STDIO_H_
    2. #define _STDIO_H_
    3. ...
    4. ...
    5. #endif

    C++头文件的作用_luoganttcc的博客-CSDN博客_c++头文件作用

  • 相关阅读:
    ThreadLocal及InheritableThreadLocal基本原理及注意项
    VUE3 + Django 接口请求每次都产生新的session_id,应该如何解决?
    Java专项进阶篇
    有几种人工神经网络算法,人工神经网络算法实例
    odoo 开发入门教程系列-约束(Constraints)
    TypeError: bases must be types
    Windows10安装Kafka教程
    笙默考试管理系统-MyExamTest----codemirror(22)
    【rbac简介】
    【智能优化算法 】基于适应度相关优化器求解单目标优化问题附matlab代码
  • 原文地址:https://blog.csdn.net/u013250861/article/details/127561067