• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            <2009年2月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            1234567

            統計

            • 隨筆 - 24
            • 文章 - 0
            • 評論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            有關include guard的一個好帖子(收藏)
            終于弄清楚了原來說的同一個頭文件不能被兩次或兩次以上包含是針對同一個源文件而言的。借用80后的流行語,真是漢哪!

            原貼地址:http://www.keil.com/forum/docs/thread10237.asp

            作者 Per Westermark

            The

            #ifndef xx
            #define xx
            ...
            #endif
            

            method is to make sure that a header file isn't included more than once from the same c file.

            You can not - and normally don't want to - stop multiple c files from including the same header file.

            A header file is included because:
            1) You have specifically added a line #include "xx" or #include <xx> in the source file. Don't do that unless you want the file to be included :)
            2) You are including one header file, that it it's turn (one or more steps away) includes another header file. But a header file should only contain a recursive #include if it really needs that other file for some declarations. Hence, you need to include it.

            What does this mean?

            If the header file must be seen by multiple source files, you can't use it to allocate global variables, since the linker would then complain about multiple sets of global variables with the same name. This can be solved with the following:

            //globals.h
            #ifndef _GLOBALS_H
            #define _GLOBALS_H
            #if defined MAIN
            #define EXTERN
            #else
            #define EXTERN extern
            #endif
            ...
            EXTERN int my_global_variable;
            #endif // _GLOBALS_H
            

            // main.c
            #define MAIN
            #include "globals.h"
            ...
            // misc.c
            #include "globals.h"
            ...
            

            In this case, only the inclusion in main.c will result in an "allocation" of global variables, because the #define EXTERN will be empty. All other source files that includes "globals.h" will just see the type information for the global variables.

            posted on 2009-02-19 09:04 小蔥蘸醬 閱讀(999) 評論(2)  編輯 收藏 引用

            評論

            # re: 有關include guard的一個好帖子(收藏) 2009-02-19 21:19 陳梓瀚(vczh)

            EXTERN的時候,如果剛好main沒有引用它,那就鏈接錯誤了- -#
              回復  更多評論    

            # re: 有關include guard的一個好帖子(收藏)[未登錄] 2009-02-20 16:15 小蔥蘸醬

            @陳梓瀚(vczh)
            歡迎評論!
            只要在include "globals.h"前定義了MAIN,就不會聯接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            国产精品99久久久久久宅男小说| 精品久久久无码21p发布| 精品久久一区二区| 国产99久久久国产精免费| 日韩欧美亚洲国产精品字幕久久久| 伊人伊成久久人综合网777| 国产激情久久久久久熟女老人| 久久发布国产伦子伦精品| 久久精品国产亚洲Aⅴ香蕉| 亚洲国产精品18久久久久久| 97超级碰碰碰碰久久久久| 国产69精品久久久久9999APGF | 久久婷婷是五月综合色狠狠| 97久久香蕉国产线看观看| 久久精品一区二区三区AV| 国产精品内射久久久久欢欢| 国产成人久久精品一区二区三区 | 无码人妻久久一区二区三区免费| 91精品国产高清久久久久久91| 亚洲精品乱码久久久久久蜜桃图片 | 久久亚洲高清综合| 国产精品永久久久久久久久久| 久久精品人人做人人爽电影蜜月 | 久久人人爽爽爽人久久久| 久久精品极品盛宴观看| 久久精品国产亚洲5555| 一本伊大人香蕉久久网手机| 97久久精品无码一区二区| 奇米影视7777久久精品| 久久天天躁狠狠躁夜夜躁2014| 午夜精品久久久久久| 久久国产一片免费观看| 丰满少妇人妻久久久久久4| 久久亚洲高清观看| 精品精品国产自在久久高清 | 久久精品国产99国产精品澳门| 久久99国产综合精品| 72种姿势欧美久久久久大黄蕉| 狠狠88综合久久久久综合网| 久久er热视频在这里精品| 伊人丁香狠狠色综合久久|