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

            再談下聲明、定義、初始化、賦值和extern

            雖然定義也是聲明,但為了方便說明問題,下文中的聲明只是單純的聲明,定義就只是定義。

            1.      聲明、定義、初始化和賦值四個術(shù)語有著本質(zhì)的不同,雖然有時候看起來差不多甚至完全一樣,但如果不搞清楚很容易出現(xiàn)錯誤,或者錯了不知道怎么改。

             

            2.     a: extern關(guān)鍵詞用來表明這是一個聲明:extern int I;變量i就是一個聲明。聲明前面一定要有一個關(guān)鍵字extern,沒有這個關(guān)鍵詞就不是一個聲明。

            b: 沒有extern就是一個定義,比如int i=9;是一個定義,特別要注意的是int i;這也是一個定義。

            c: 初始化就是在變量定義時給變量一個初值,所以初始化語句也一定是一個定義語句,但反過來就不對了,因為類似于:int i;就是定義,但沒有初始化。特別要注意的是:extern int i = 9;雖然有extern關(guān)鍵詞,但是因為初始化了,所以這也是一個定義,不是聲明。

            d: 賦值語句就簡單了,賦值語句是給一個已經(jīng)定義的變量(不管這個變量有沒有初始化)一個新值。特別要注意的是,要給賦值的變量必須已經(jīng)定義過了,僅僅聲明是不行的。

             

            3.       extern關(guān)鍵詞除了表明這是一個聲明以外,更重要的是表明:所聲明的變量的定義可能是在程序中其他文件里。如下代碼

                //file1.cpp

            #include <iostream>
            using namespace std;
            extern int i;//這是一個聲明,告訴編譯器變量i的定義有可能是在其他源文件中,即使本文件中沒有i的定義,你也不要報錯。
            void main()
            {
                extern int i;//同樣是對i的聲明,作用與上面的聲明完全一樣,說明聲明可以存在多個,實際上這兩個聲明只要任意一個就可以了。但是兩個聲明語句如果一個都沒有,編譯器就會認(rèn)為變量i沒有定義,會報錯。

                i=0;//賦值語句,給變量i一個新值,變量賦值前必須要已經(jīng)定義了,如果不存在file2文件中的定義語句,雖然不會出現(xiàn)編譯錯誤,但是鏈接會有錯。
                cout<<i;
            }

            //file2.cpp

            int i;//首先是一個定義,而且是一個沒有初始化的定義(不過實際上全局變量i被默認(rèn)初始化為0),變量i被定義在file2源文件中

             

             

            4.      一個程序中可能包括不只一個文件,所有文件中同一個變量(其實主要說的全局變量)必須總共只能定義一次,但是聲明可以有無數(shù)個。而且如果文件A中用到的變量的定義是在其他文件中,那么在文件A中用這個變量之前,一定要加上一句extern聲明語句,告訴編譯器我所用的這個變量有可能是在其他文件里

            5.   extern int i=9;上面已經(jīng)提到雖然有extern,但這也是一個定義,因為初始化了。類似于這種有extern也有初始化的語句,只能出現(xiàn)在全局作用域,如果出現(xiàn)在函數(shù)內(nèi)部,這是錯誤的。

            6.       (轉(zhuǎn))有關(guān)編譯器的一個特點:現(xiàn)代編譯器一般都屬于按文件編譯,就是說編譯時多個源文件自己編譯自己的,互不影響,好像只有自己一個文件。只要每個文件編譯時沒有出現(xiàn)錯誤,那么就不會發(fā)生編譯時錯誤。但是沒有發(fā)生編譯錯誤,并不代表程序就沒有錯誤,因為還會發(fā)生鏈接錯誤。比如下面這兩個代碼

                 //A.cpp
            int i;//這是變量i的定義
             
            void main()
            {
            }

            //B.cpp
            int i;//這也是變量i的定義
            編譯時兩個文件A和B是相互不影響的,所以編譯時不會出現(xiàn)任何錯誤,但是這個程序是有問題的,因為全局變量i是被定義了兩次的,所以鏈接時就會報告類似于下面的錯誤:

            B.obj : error LNK2005: "int i" (?i@@3HA) already defined in A.obj

            Debug/A.exe : fatal error LNK1169: one or more multiply defined symbols found

            另外上面也提到了,編譯時各個文件是相互不影響的,編譯器是不會認(rèn)為在這個文件中沒有定義的變量其實很有可能人家是個全局變量,在其他文件中定義了,這就要報錯。解決方法就是用extern聲明一個變量,告訴編譯器人家這個變量不是沒有定義,只是在其他文件中定義了,你別報錯了。

             

            posted on 2012-06-07 15:41 古月 閱讀(3749) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            <2014年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            C++/C

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久棈精品久久久久久噜噜| 狠狠色婷婷综合天天久久丁香| 精品久久久久中文字幕一区| 久久人人爽人爽人人爽av| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久亚洲高清综合| 中文字幕热久久久久久久| 国产精品久久久久久久久| 久久久久免费视频| 东方aⅴ免费观看久久av| 狠狠色丁香久久综合五月| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲中文久久精品无码ww16| 99热精品久久只有精品| 一本色道久久88—综合亚洲精品| 青青草国产成人久久91网| 伊人久久大香线蕉综合影院首页| 国产精品免费久久| 久久国产精品-久久精品| 人妻精品久久久久中文字幕69| 99久久免费国产精品特黄| 久久免费美女视频| 国产午夜福利精品久久2021 | 狠色狠色狠狠色综合久久| 国产精品久久久久久久久久影院| 国产亚洲精午夜久久久久久| 免费国产99久久久香蕉| 国产美女久久精品香蕉69| 久久婷婷五月综合色高清| 久久婷婷是五月综合色狠狠| 欧美成a人片免费看久久| 久久久久这里只有精品| 久久精品人妻一区二区三区| 日韩亚洲欧美久久久www综合网| 91精品国产高清久久久久久io | 精品国产91久久久久久久a| 狠狠色伊人久久精品综合网| 狠狠久久综合伊人不卡| 国内精品久久久久久久涩爱| 国产精品久久久久影院色| 99久久精品无码一区二区毛片|