zoukankan      html  css  js  c++  java
  • 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 

    。。。。

  • 相关阅读:
    解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
    解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
    随机实例,随机值
    Spring4笔记
    struts2笔记(3)
    struts2笔记(2)
    获取文本的编码类型(from logparse)
    FileUtil(from logparser)
    DateUtil(SimpleDateFormat)
    struts2笔记
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7147005.html
Copyright © 2011-2022 走看看