• <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年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            • 隨筆 - 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 小蔥蘸醬 閱讀(996) 評論(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精品国产免费久久久久久下载| 久久精品无码专区免费东京热| 国产日韩欧美久久| 久久久一本精品99久久精品66| 久久精品二区| 久久精品国产99国产电影网| 亚洲v国产v天堂a无码久久| 久久精品国产99国产电影网| 亚洲愉拍99热成人精品热久久 | 亚洲AV无一区二区三区久久| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 欧洲人妻丰满av无码久久不卡| 2020最新久久久视精品爱 | 久久精品一区二区三区不卡| 亚洲国产另类久久久精品| 久久久久久亚洲精品不卡| 美女写真久久影院| 国产精品久久网| 久久免费的精品国产V∧| 久久久久久久波多野结衣高潮| 亚洲午夜久久久精品影院| 狠色狠色狠狠色综合久久| 人妻精品久久无码区| 亚洲AV无码久久精品蜜桃| 亚洲精品无码久久久久去q | 91久久香蕉国产熟女线看| 国内精品久久久久影院一蜜桃| 日韩人妻无码精品久久免费一 | 国产高清国内精品福利99久久| 91精品免费久久久久久久久| 91精品婷婷国产综合久久| 国产精品综合久久第一页| 无码人妻少妇久久中文字幕| 性做久久久久久久久老女人| 亚洲精品无码久久久久AV麻豆| 亚洲国产一成久久精品国产成人综合 |