zoukankan      html  css  js  c++  java
  • #ifndef/#define/#endif以及#if defined/#else/#endif使用详解

    1、#ifndef_WINDOWS_PLAYM4_H_
         #define _WINDOWS_PLAYM4_H_

         #endif

    问题:想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?

    解决:其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:a.h文件中存在#include"c.h",而此时a.cpp文件中导入了#include"a.h" 和#include"c.h",此时就会造成c.h重复引用。

    头文件重复引用后果:有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

     

    是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?

    答案:不是一定要加,但是不管怎样,用ifndexxx #define xxx#endif或者其他方式避免头文件重复包含,只有好处没有坏处。个人觉得培养一个好的编程习惯是学习编程的一个重要分支。

    下面给一个#ifndef/#define/#endif的格式:

      #ifndefA_H意思是"if not define a.h"  如果不存在a.h

     接着的语句应该#defineA_H  就引入a.h

     最后一句应该写#endif  否则不需要引入

    #ifndef GRAPHICS_H // 防止graphics.h被重复引用 
    #define GRAPHICS_H 
    #include <math.h> // 引用标准库的头文件 
    #include “header.h” // 引用非标准库的头文件 
    void Function1(…); // 全局函数声明 
    class Box // 类结构声明 
    { 
    … 
    }; 
    #endif

    2、#ifdefined( _WINDLL)
           #define PLAYM4_API extern "C"__declspec(dllexport)
       #else 
           #define PLAYM4_API  extern "C"__declspec(dllimport)
       #endif

    因为对于一个大程序而言,我们可能要定义很多常量(不管是放在源文件还是头文件),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦。if defined正是为这种情况提供了解决方案,举个例子,如下: 
    #define .... 
    #define .... 
        .... 
    #define a 100 
        .... 
    此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子 
    #if defined a 
    #undef a 
    #define a 200 
    #endif 
    上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a200 

    同样,检验a是否定义: 
    #ifndef a    //如果a没有被定义 
    #define a 100 
    #endif 
    以上所用的宏中:#undef为解除定义,#ifndef是ifnot defined的缩写,即如果没有定义。 
    这就是#if defined 的唯一作用!

    1) 
    #if defined XXX_XXX 
    #endif 
    是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。 

    一般.h文件里最外层的 
    #if !defined XXX_XXX 
    #define XXX_XXX 
    #endif 
    是为了防止这个.h头文件被重复include。 

    2) 
    #error XXXX 
    是用来产生编译时错误信息XXXX的,一般用在预处理过程中; 
    例子: 
    #if !defined(__cplusplus) 
    #error C++ compiler required. 
    #endif 


  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/peterYong/p/6556552.html
Copyright © 2011-2022 走看看