• <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,就不會聯接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            伊人久久大香线蕉综合5g| 久久综合伊人77777麻豆| 亚洲国产成人乱码精品女人久久久不卡| 日本精品久久久久中文字幕8| 国产精品免费久久久久久久久| 99热精品久久只有精品| 久久久久一级精品亚洲国产成人综合AV区 | 中文字幕无码久久人妻| 久久久久久亚洲精品影院| 久久夜色精品国产欧美乱| 狠狠色丁香婷综合久久| 无码国内精品久久人妻麻豆按摩| 久久久久国产精品人妻| 亚洲国产精品久久久久网站 | 久久性生大片免费观看性| 色婷婷久久综合中文久久一本| 99久久精品免费看国产一区二区三区| 狠狠色丁香久久综合婷婷| 老男人久久青草av高清| 中文字幕亚洲综合久久| 欧美丰满熟妇BBB久久久| 久久乐国产精品亚洲综合| 国内精品人妻无码久久久影院| 亚洲国产成人精品无码久久久久久综合 | 亚洲va久久久噜噜噜久久男同| 久久综合九色综合精品| 亚洲中文字幕久久精品无码喷水| 91精品国产91久久久久久青草| 亚洲αv久久久噜噜噜噜噜| 天堂无码久久综合东京热| 超级碰久久免费公开视频| 久久国产色AV免费观看| 色8久久人人97超碰香蕉987| 三级韩国一区久久二区综合| 久久99精品久久久久久不卡| 久久香蕉综合色一综合色88| 久久精品9988| 99久久精品费精品国产| 久久国产综合精品五月天| 久久九九久精品国产免费直播| 久久成人永久免费播放|