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中。不管你的头文件会不会被多个文件引用,你最好是都加上这个。

  • 相关阅读:
    codeforces 616B Dinner with Emma
    codeforces 616A Comparing Two Long Integers
    codeforces 615C Running Track
    codeforces 612C Replace To Make Regular Bracket Sequence
    codeforces 612B HDD is Outdated Technology
    重写父类中的成员属性
    子类继承父类
    访问修饰符
    方法的参数
    实例化类
  • 原文地址:https://www.cnblogs.com/sylar5/p/10065376.html
Copyright © 2011-2022 走看看