• <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 小蔥蘸醬 閱讀(999) 評論(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,就不會聯接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            国产69精品久久久久9999APGF| 一本一本久久A久久综合精品| 91久久精一区二区三区大全| 99久久综合狠狠综合久久止| 精品一区二区久久久久久久网站| 91麻精品国产91久久久久| 久久国产视频网| 国色天香久久久久久久小说| av无码久久久久久不卡网站| 久久最新免费视频| 精品久久久久久国产潘金莲 | 婷婷伊人久久大香线蕉AV | 久久99精品久久久久久野外| 久久香综合精品久久伊人| 嫩草影院久久国产精品| 亚洲精品无码久久久| 国产成人香蕉久久久久| 久久棈精品久久久久久噜噜| 国产精品久久久久久久app| 香港aa三级久久三级| 久久本道伊人久久| 久久国产精品77777| 99久久夜色精品国产网站| 久久久久国产一区二区| 久久综合九色综合欧美狠狠| 久久综合给合久久狠狠狠97色69| 青青热久久国产久精品 | 精品国产乱码久久久久久1区2区| 国产精品亚洲综合久久 | 欧美亚洲日本久久精品| 久久国产福利免费| 久久精品国产精品亚洲艾草网美妙| 国产精品禁18久久久夂久| 久久婷婷成人综合色综合| 无码国内精品久久人妻蜜桃| 无遮挡粉嫩小泬久久久久久久| 久久婷婷午色综合夜啪| 久久AV无码精品人妻糸列| 久久九九兔免费精品6| 久久香蕉超碰97国产精品| 久久亚洲精品中文字幕|