• <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 小蔥蘸醬 閱讀(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,就不會聯接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            男女久久久国产一区二区三区| 欧美午夜精品久久久久久浪潮| 精产国品久久一二三产区区别| 亚洲国产精品无码久久一线 | 九九久久99综合一区二区| 91精品国产乱码久久久久久| 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品国产亚洲综合色| 久久久久久久综合综合狠狠| 区久久AAA片69亚洲| 国产精品久久亚洲不卡动漫| 人妻无码久久精品| 99国产欧美久久久精品蜜芽| 无码国内精品久久人妻麻豆按摩| 日本欧美久久久久免费播放网| 国产精品免费久久久久久久久| 亚洲狠狠婷婷综合久久久久| 久久天天躁狠狠躁夜夜av浪潮| 久久国产精品99精品国产| 亚洲国产精品成人久久蜜臀| 天天综合久久久网| 欧洲人妻丰满av无码久久不卡 | 一本综合久久国产二区| 国产精品久久久久影院色| 亚洲国产精品无码久久一线| 亚洲v国产v天堂a无码久久| 一本伊大人香蕉久久网手机| 国产成人久久AV免费| 99精品国产99久久久久久97| 久久这里有精品| 亚洲AⅤ优女AV综合久久久| 开心久久婷婷综合中文字幕| 国产高潮久久免费观看| 亚洲国产成人久久精品动漫| 国产∨亚洲V天堂无码久久久| 日韩精品久久久久久免费| 亚洲精品乱码久久久久久久久久久久 | 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲AV无码1区2区久久 | 久久久91精品国产一区二区三区| 久久久久亚洲av无码专区|