【问题标题】:Preprocessor #ifndef预处理器#ifndef
【发布时间】:2012-03-13 18:51:32
【问题描述】:

假设我有a.h,其中包括以下内容:

<stdbool.h>
<stddef.h>
<stdin.h>

假设我也有b.h,其中还包括&lt;stdbool.h&gt;。如果a.h 中有#ifndef 预处理器定义语句而b.h 没有。 a.h 是否只包含b.h 中未包含的内容?所以当b.h包含a.h时,a.h会包含stddef.hstein.h而不是重新包含stdbool.h还是那些预处理器定义函数只用于查看整个类是否被重新定义,而不是特定的里面的功能?

编辑:

另外,假设b.h 包含另一个包含stdbool.h 的头文件 - 这使得b.h 具有来自该类和a.hstdbool.h。这会导致错误吗?

【问题讨论】:

    标签: c header-files ifndef


    【解决方案1】:

    必须使所有 C 标准头文件可以被多次包含并以任意顺序包含:

    标准标题可以按任何顺序包含;每个都可能包括在内 在给定的范围内不止一次,没有任何不同的效果 只包含一次

    【讨论】:

      【解决方案2】:

      如果stdbool.h 本身具有包含警卫(#ifndef),那么一切都会好起来的。否则,您可能确实会包含一些标题两次。会不会造成问题?这取决于。如果包含两次的头文件只包含声明,那么一切都会编译——它只需要几纳秒的时间。想象一下:

      int the_answer(void); // <-- from first inclusion
      int the_answer(void); // <-- from from second inclusion - this is OK
                            //       at least as long as declarations are the same
      
      int main()
      {
          return the_answer();
      }
      

      另一方面,如果有定义,则会导致错误:

      int the_answer(void)  // <-- from first inclusion - OK so far
      {
          return 42;
      }
      
      int the_answer(void)  // <-- from second inclusion
      {                     //     error: redefinition of 'the_answer'
          return 42;
      }
      
      int main()
      {
          return the_answer();
      }
      

      【讨论】:

      • 一旦您从多个文件中使用相同的标题,标题中的定义无论如何都会导致链接错误,所以不要这样做。
      【解决方案3】:

      大部分header开头都是正常的

      #ifndef _HEADERFILENAME_H_
      #define _HEADERFILENAME_H_
      

      并以以下行结束:

      #endif
      

      如果您包含两次标头,由于#ifndef#define#endif,您的程序第二次将不再包含完整的标头

      【讨论】:

        猜你喜欢
        • 2017-02-25
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 2012-03-11
        • 2010-09-07
        • 2015-04-15
        相关资源
        最近更新 更多