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

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            C++ "multiple definition of .. first defined here"

            Posted on 2019-02-26 16:02 Prayer 閱讀(1030) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX 、makefile
            https://www.cnblogs.com/zjutzz/p/4018816.html

            在C++中,有時候需要在不同文件中使用同一個變量。對于這類變量如果處理不當(dāng),很容易出現(xiàn)“multiple definition of... first defined here”的錯誤。

            例如,定義了如下3個文件:global.h, a.cpp, b.cpp

            //global.h: #ifndef _GLOBAL_H_ #define _GLOBAL_H_  const int a=1; int b;  #endif
            //a.cpp #include <iostream> #include <stdlib.h> #include "global.h"  using namespace std;  void test1() {      cout<<"test1"<<endl; }
            //b.cpp #include <iostream> #include <stdlib.h> #include "global.h"  using namespace std;  void test2() {     cout<<"test2"<<endl; }  void main() {   cout<<"hello world"<<endl; }

            執(zhí)行編譯命令:

            g++ -o main a.cpp b.cpp

            提示錯誤為:

            [chris@zz jojo]g++ -o main a.cpp b.cpp
            /tmp/ccc7OcsO.o:(.bss+0x0): multiple definition of `b'
            /tmp/ccs7q2VA.o:(.bss+0x0):第一次在此定義

            出錯原因:a.cpp和b.cpp先分別被編譯為.o格式的目標(biāo)文件,兩個目標(biāo)文件再被鏈接器鏈接起來,這當(dāng)中a.cpp和b.cpp分別進(jìn)行了一次include,相當(dāng)于global.h中的代碼重復(fù)出現(xiàn)了一次。因?yàn)閍是const類型,所以重新定義也沒事;但是b只是普通變量,重復(fù)定義顯然不行。

            顯然,一個解決辦法是把b定義為const int類型。或者,定義成static int類型也行。

            還有一種解決方案,就是把global.h變?yōu)間lobal.c文件,a.cpp和b.cpp中不再include它,但是編譯的時候把global.c也編譯進(jìn)去,就可以了:

            g++ -o main global.c  a.cpp b.cpp

            再舉一個class相關(guān)的例子。比如有Body和Mouth兩個類,Body的greet方法會調(diào)用Mouth的say方法,而main函數(shù)中會調(diào)用全局變量body的greet方法。為了只是用一個body和一個mouth對象,可以這么寫:

            //body.h #ifndef BODY_H #define BODY_H  #include <mouth.h>  class Body { public:     Body();     ~Body();     void greet(); };  extern Body body;   #endif 
            //body.cpp #include <body.h>  Body::Body(){}  Body::~Body() {}  void Body::greet() {     mouth.say(); } 
            //mouth.h #ifndef MOUTH_H #define MOUTH_H  class Mouth { public:     Mouth();     ~Mouth();     void say(); };  extern Mouth mouth;   #endif 
            //mouth.cpp #include <mouth.h> #include <iostream>  using namespace std;  Mouth::Mouth() {}  Mouth::~Mouth() {}  void Mouth::say() {     cout << "Have a Nice day!" << endl; } 
            //class.cpp #include <body.h> #include <mouth.h>   Body body; Mouth mouth; 
            //main.cpp #include <iostream> #include <body.h> using namespace std;  int main() {     body.greet(); } 

            上面代碼中的include,雖然都是用的尖括號,但因?yàn)榫幾g時可以通過指定include路徑,不會出問題~
            編譯命令:

            g++ -I ./ mouth.cpp body.cpp class.cpp main.cpp -o main

            能夠正常運(yùn)行。

            一本一道久久综合狠狠老| 久久精品男人影院| 一本久久久久久久| 久久超碰97人人做人人爱| 色妞色综合久久夜夜| 精品国产91久久久久久久a| 2020久久精品国产免费| 国产精品久久久久aaaa| 99国产欧美久久久精品蜜芽| 成人国内精品久久久久影院| 国产精品久久久久久| 91亚洲国产成人久久精品| 91久久成人免费| 久久夜色精品国产亚洲av| 午夜精品久久久久久影视777| 一本色道久久88综合日韩精品 | 精品国产一区二区三区久久蜜臀| 久久精品中文字幕久久| 国产精品va久久久久久久| 久久久久国色AV免费观看| 亚洲精品无码久久久| 日本久久久久亚洲中字幕| 99999久久久久久亚洲| 国产精品99久久久久久董美香| 欧美午夜A∨大片久久 | 欧美性大战久久久久久| 久久香综合精品久久伊人| 亚洲AV无码1区2区久久| 26uuu久久五月天| 日韩精品久久久久久久电影| 久久亚洲精品成人av无码网站| 久久九九亚洲精品| 久久无码AV中文出轨人妻| 国产精品99精品久久免费| 麻豆国内精品久久久久久| 97精品伊人久久大香线蕉app| 久久综合伊人77777麻豆| 久久久久人妻一区二区三区vr| 久久国产精品偷99| A狠狠久久蜜臀婷色中文网| 亚洲精品NV久久久久久久久久|