• <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

            統(tǒng)計

            • 隨筆 - 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 小蔥蘸醬 閱讀(989) 評論(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,就不會聯(lián)接錯誤,跟引用有什么關系呢?
              回復  更多評論    
            久久精品成人| 久久精品国产一区二区电影| 久久人人爽人人人人片av| 婷婷国产天堂久久综合五月| 久久久亚洲欧洲日产国码是AV| 无码人妻久久一区二区三区免费丨 | 亚洲欧美日韩久久精品第一区| 久久婷婷五月综合97色一本一本 | 久久不射电影网| 国产精品99久久不卡| 囯产极品美女高潮无套久久久| av国内精品久久久久影院 | 91麻豆国产精品91久久久| 久久久久亚洲AV无码专区体验| 久久精品国产黑森林| 国产精品久久久久久一区二区三区 | 久久久91人妻无码精品蜜桃HD | 亚洲va中文字幕无码久久不卡| 日韩精品国产自在久久现线拍| 久久综合亚洲色一区二区三区| 国产精品伊人久久伊人电影| 久久精品国产亚洲av麻豆色欲| 亚洲一级Av无码毛片久久精品| 一本久久a久久精品综合夜夜| 奇米综合四色77777久久| 久久综合九色综合欧美就去吻| 久久综合久久综合久久| 国产精品一久久香蕉国产线看观看| 久久久久久久久久久久久久| 无码乱码观看精品久久| 久久久99精品一区二区| 精品人妻伦一二三区久久| 日韩精品国产自在久久现线拍 | 日韩精品久久久久久久电影| 精品国产综合区久久久久久| 成人国内精品久久久久影院VR| 久久电影网一区| 欧美久久综合性欧美| 久久se精品一区二区| 中文字幕成人精品久久不卡| 精品国产91久久久久久久|