zoukankan      html  css  js  c++  java
  • c,c++里面,头文件里面的ifndef /define/endif的作用

      是关于头文件里面的一些地方:

    例如:要编写头文件test.h

             在头文件开头写上两行:

              #ifndef _TEST_H

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

             ············

             ············

             头文件结尾写上一行:

              #endif

        大概是以前没有学好吧,对这里不是很理解,为什么要用这些呢?刚才上网查了查,借鉴了点高手的,自己总结了一点,就写在这里了,有什么错误之处,请大侠们指出

        1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

    例如:

    假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h。  
    a.cpp的头部是:  
    #include   "b.h "  
    #include   "c.h "  
    b.h和c.h的头部都是:  
    #include   "d.h "  
    而d.h里面有class   D的定义。  
    这样一来,  
    编译器编译a.cpp的时候,先根据#include   "b.h "去编译b.h这个问题,再根据b.h里面的#include   "d.h ",去编译d.h的这个文件,这样就把d.h里面的class   D编译了;  
    然后再根据a.cpp的第二句#include   "c.h ",去编译c.h,最终还是会找到的d.h里面的class   D,但是class   D之前已经编译过了,所以就会报重定义错误。 加上ifndef/define/endif,就可以防止这种重定义错误。

    所以还是把头文件的内容都放在#ifndef和#endif中吧。  
    不管你的头文件会不会被多个文件引用,你都要加上这个。  
    一般格式是这样的:   
    #ifndef   <标识 >   
    #define   <标识 >   
    ......   
    ......   
    #endif   <标识 >  
    在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h   
    #ifndef   _STDIO_H_   
    #define   _STDIO_H_   
    ......   
    #endif  

     
    2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。   
    #ifndef   AAA   
    #define   AAA   
    ...   
    int   i;   
    ...   
    #endif   
    里面有一个变量定义在vc中链接时就出现了i重复定义的错误,而在c中成功编译。   
    原因:   
    (1).当你第一个使用这个头的.cpp文件生成.obj的时候,int   i   在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int   i   又被定义然后两个obj被另外一个.cpp也include   这个头的,连接在一起,就会出现重复定义.   (2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int   i,则自动认为其中一个是定义,其他的是声明。 

      
    (3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。  
    (参考解决方法:   
    (1).把源程序文件扩展名改成.c。   
    (2).推荐解决方案:   .h中只声明   extern   int   i;  
            在.cpp中定义   
    #ifndef   __X_H__   
    #define   __X_H__   
    extern   int   i;   
    #endif   //__X_H__   int   i;   
    注意问题:变量一般不要定义在.h文件中。

  • 相关阅读:
    metal的gpu query
    体积雾 global fog unity 及改进
    hdr rt format对颜色的影响
    unity deferred lighting
    unity linear space时 photoshop blend的正确设置
    unity linear work flow
    一些数据 bandwidth之类
    deferred rendering with msaa
    unity 显示mipmaplevel
    【转】在C#中使用SendMessage
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786670.html
Copyright © 2011-2022 走看看