zoukankan      html  css  js  c++  java
  • #ifndef 的用法介绍

    ifndef是 if not define 的缩写,一种宏定义。它是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种--条件编译。

    其使用方式是:

    #define X
    ...
    #endif

     //c语言在对程序进行编译时,会先根据预处理命令进行预处理,C语言编译系统包括预处理,编译和链接等部分。

    #ifndef X  //先测试是否被宏定义过
    #define X 
    程序段1//如果X没有被宏定义过,定义X,并编译程序段1;
    #else
    程序段2 //如果X已经定义过了则编译程序段2 的语句,忽视程序段1.
    #endif

     条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译。 

    语句1 #ifndef 标识1
    语句2 #define 标识1
    语句3 #endif
    语句4 ……
    语句5 ……

     该段代码意思是:如果标识1没有被定义,则重定义标识1,即执行语句2、语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……

    ifndef和endif要一起使用,不能存在丢失。

    假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,头文件B又包含了头文件A,则最终该源文件包含了两次头文件A。如果你在头文件A里定义了结构体或者类类型(这是最常见的情况),那么问题来了,编译时会报大量的重复定义错误。[1]

    例如要编写头文件a.h,需要在头文件开头写上两行:

    #ifndef _A_H
    #define _A_H//一般是文件名的大写

     头文件结尾写上一行:

    #endif

     这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。

    当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H 和 #endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和 #endif之间的代码也就不会再次被包含,这样就避免了重定义了。这样我们把头文件的内容都放在#ifndef和#endif中。不管你的头文件会不会被多个文件引用,你最好是都加上这个。

  • 相关阅读:
    [React Router v4] Render Catch-All Routes with the Switch Component
    [React Router v4] Render Nested Routes
    关系数据库规范化理论 函数依赖与范式理论
    Notepad++背景颜色设置
    initial pointer [expert c]
    世界微波射频领域传奇人物
    hdu 4619 Warm up 2 ( 二分图最大匹配 )
    关于数据的归档存入文件和读取文件
    android中通过自定义xml实现你需要的shape效果 xml属性配置
    Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
  • 原文地址:https://www.cnblogs.com/sylar5/p/10065376.html
Copyright © 2011-2022 走看看