• <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年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            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 小蔥蘸醬 閱讀(988) 評論(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,就不會聯接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            97久久超碰国产精品2021| 国产亚洲欧美成人久久片| 99热成人精品热久久669| 午夜不卡久久精品无码免费| 亚洲香蕉网久久综合影视| 久久久老熟女一区二区三区| 久久99国产精品久久| 久久亚洲国产成人影院网站| 精品国产乱码久久久久久郑州公司 | 久久综合久久美利坚合众国| 麻豆AV一区二区三区久久| 国产精品久久久久久影院| 东京热TOKYO综合久久精品| 久久99国产精一区二区三区| 97久久超碰国产精品2021| 久久人妻少妇嫩草AV无码专区| 91亚洲国产成人久久精品| 丁香色欲久久久久久综合网| 国产香蕉97碰碰久久人人| 国产精品禁18久久久夂久| 九九久久自然熟的香蕉图片| 欧美日韩中文字幕久久伊人| 久久精品国产亚洲一区二区三区| 中文字幕热久久久久久久| 久久人人爽人人爽人人片AV麻豆 | 国产精品va久久久久久久| 久久精品亚洲中文字幕无码麻豆 | 四虎亚洲国产成人久久精品| 久久午夜电影网| 久久精品一区二区三区中文字幕| 午夜精品久久久久久久| 国产午夜福利精品久久2021| 久久99精品国产一区二区三区| 久久国产精品99精品国产| 久久久久久久久无码精品亚洲日韩 | 国产精品美女久久福利网站| 久久综合久久综合亚洲| 波多野结衣AV无码久久一区| 久久综合亚洲色一区二区三区| 久久精品一区二区三区中文字幕| 中文无码久久精品|