• <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>
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            • 隨筆 - 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 小蔥蘸醬 閱讀(994) 評論(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,就不會聯接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            97r久久精品国产99国产精| 亚洲精品无码久久久| 久久精品毛片免费观看| 久久国产乱子伦免费精品| 香蕉久久夜色精品国产小说| 久久国产香蕉视频| 久久久久精品国产亚洲AV无码| 午夜天堂精品久久久久| 91精品国产91久久| 久久成人国产精品免费软件| 国产精品视频久久| 综合久久一区二区三区 | 理论片午午伦夜理片久久 | 日本精品久久久中文字幕| 久久午夜综合久久| 国产精品女同久久久久电影院| 久久青青草原亚洲av无码| 亚洲国产精品一区二区久久hs| 精品久久久久久亚洲| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲国产精品久久66| 久久天天躁狠狠躁夜夜2020老熟妇 | 久久久久波多野结衣高潮| 久久99国产精品二区不卡| 中文字幕精品久久| 久久精品国产色蜜蜜麻豆| 2021精品国产综合久久| 色综合久久久久综合体桃花网 | 久久精品中文无码资源站| 久久精品中文字幕第23页| 91精品国产高清91久久久久久| 亚洲中文字幕无码久久精品1| 色婷婷噜噜久久国产精品12p| 97久久香蕉国产线看观看| 久久亚洲AV成人无码国产| 久久亚洲AV无码精品色午夜麻豆| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 久久精品一本到99热免费| 久久久久青草线蕉综合超碰| 久久中文字幕人妻熟av女| 色老头网站久久网|