• C++ 中 #ifndef, #define, #endif 宏定义


    目的:为了保证包含的内容只被程序(include) 和编译了一次。判断预处理器常量是否已被定义。

    预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件中的内容都已经包含到需要他们的.cpp 中。最后生成.exe文件是由编译和链接两步完成的。编译时源代码生成obj 二进制目标文件的过程,由于编译时独立的,所以在单元里可以有重名的函数。如x.cpp中有void a(), b.cpp中也有 void a(); 编译过程中,只要声明的东西就能使用,不需要定义,声明可以重复。extern 在编译时告诉该编译单元该变量的定义在别的编译单元。在链接时,定义在整个程序中的函数定义只能有一份。

    # ifndef : (if not define)  

    如果有两个c文件,两个c文件都include 了同一个header。在编译时,这两个c文件要一同编译成一个可运行文件,就出现了大量的声明冲突。所以把header中的内容放在# ifndef 和#endif中。

             #ifndef <标识>

       #define <标识>

            。。。

          。。。

           #endif

           这个标识是自由命名的,但每个header应该是唯一的,一般的规则为header名大写,前加下划线, . 变为下划线。。如 head.h -> _HEAD_H_

       假设头文件第一次被引用,_HEAD_H_ 没有被定义,所以就执行宏定义,直到#endif。当该头文件被第二次引用时,_HEAD_H_已经被定义,就不会再执行。

    eg.

    #ifndef _MYHEAD_H_
    #define _MYHEAD_H_
       class A;
    #endif

    x. cpp and y.cpp include the header a.h. Class A can only be defined once.在编译阶段,两个编译单元都会分别包含 a.h。即使使用了#ifndef # define # endif. 这就是为什么当a.h被多个文件包含时,不能在a.h中定义变量及函数的原因,因为在链接阶段会出现重定义。但是在a.h中定义static变量是允许的,因为在a.h中写  static int s=0; 在x.cpp 和y.cpp 中使用s将为两个独立的s。  

    C 语言中是容忍重复声明的,C++中不可以。

    看似 #ifndef #define 没用,但是当x.cpp中多写了多个#include"a.h"时,使用#ifndef #define 在预编译阶段就只会包含一个a.h。eg. 当 x.cpp中包含了 a.h 和b.h, 而a.h 又包含了b.h,那么使用#ifndef # define 就只会包含一份b.h.

    相同功能的有:

    #pragma once 

    。。。。

  • 相关阅读:
    大数据方面核心技术有哪些
    ECS 挂载 OSS 多Bucket
    SqlServer 服务无法启动 操作系统错误: 5(拒绝访问。)
    java System类
    java Arrays类
    MySQL 高可用方案研究
    这个设计挺好的
    git强制提交命令
    React useEffect Hook的对象 & 数组依赖 useEffect监控复杂对象
    QQ浏览器基于chromeium70
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7147005.html
Copyright © 2020-2023  润新知