• <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)計(jì)

            • 隨筆 - 24
            • 文章 - 0
            • 評(píng)論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            有關(guān)include guard的一個(gè)好帖子(收藏)
            終于弄清楚了原來說的同一個(gè)頭文件不能被兩次或兩次以上包含是針對(duì)同一個(gè)源文件而言的。借用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) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: 有關(guān)include guard的一個(gè)好帖子(收藏) 2009-02-19 21:19 陳梓瀚(vczh)

            EXTERN的時(shí)候,如果剛好main沒有引用它,那就鏈接錯(cuò)誤了- -#

            # re: 有關(guān)include guard的一個(gè)好帖子(收藏)[未登錄] 2009-02-20 16:15 小蔥蘸醬

            @陳梓瀚(vczh)
            歡迎評(píng)論!
            只要在include "globals.h"前定義了MAIN,就不會(huì)聯(lián)接錯(cuò)誤,跟引用有什么關(guān)系呢?

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久91精品国产91久久小草| 久久久久亚洲AV片无码下载蜜桃| 国产精品禁18久久久夂久| 久久精品国产99国产精品澳门| 99久久婷婷国产综合精品草原| 亚洲婷婷国产精品电影人久久| 少妇久久久久久久久久| 精品免费久久久久国产一区| 久久综合精品国产二区无码| 久久国产精品免费一区二区三区| 国产成人无码精品久久久性色 | 日批日出水久久亚洲精品tv| 色偷偷88888欧美精品久久久| 国产精品伊人久久伊人电影| 亚洲国产另类久久久精品小说 | 亚洲国产精品久久电影欧美| 久久精品国产亚洲精品| 国内精品久久久久久99蜜桃| 合区精品久久久中文字幕一区 | 国产成人无码精品久久久免费 | 国产亚州精品女人久久久久久| 精产国品久久一二三产区区别 | 国产精品成人精品久久久| 久久国产色AV免费看| 亚洲精品97久久中文字幕无码| 99久久精品国产一区二区| 久久久免费精品re6| 久久婷婷激情综合色综合俺也去| 午夜精品久久久内射近拍高清| 久久无码人妻精品一区二区三区| 久久99精品国产一区二区三区 | 精品久久久久久国产免费了| 中文字幕成人精品久久不卡| 人人狠狠综合久久亚洲88| 九九久久自然熟的香蕉图片| 99久久er这里只有精品18| 久久久久99精品成人片试看| 99re久久精品国产首页2020| 99久久免费国产特黄| 国产三级观看久久| 久久无码一区二区三区少妇 |