1

誰かアドバイスしてくれませんか?

C++ で内部リンケージがデフォルトの場合const、以下のコードで複数の定義エラーが発生するのはなぜですか?

まず、ファイルdem.h:

#ifndef _DEM_H_
    #define _DEM_H_
    class Dem {
        public:
            static const int i;
    };

    const int Dem::i = 10;
#endif

それらimp1.cpp

#include "dem.h"
#include <iostream>

using namespace std;
extern int foo();

int main() {
        cout << foo() << endl;
}

imp2.cpp:

#include "dem.h"

int foo() {
    return Dem::i ;
}

次のコマンドと結果でコンパイルします。

$ g++ imp1.cpp imp2.cpp
/tmp/ccmGt0OY.o:imp2.cpp:(.rdata+0x0): multiple definition of `Dem::i'
/tmp/cc5sN7dz.o:imp1.cpp:(.rdata+0x0): first defined here
collect2: ld returned 1 exit status
4

2 に答える 2

3

C++11 [basic.link]、パラグラフ 5 から:

さらに、メンバー関数、静的データ メンバー、クラス スコープの名前付きクラスまたは列挙、またはクラス スコープの typedef 宣言で定義された名前のないクラスまたは列挙 (クラスまたは列挙がリンケージ目的で typedef 名を持つようにする) (7.1. 3)、クラスの名前に外部リンケージがある場合、外部リンケージがあります。

クラスには外部リンケージがあるため、静的データ メンバーにも外部リンケージがあります。

于 2012-04-05T03:45:36.463 に答える
0

コンパイルユニットに対して静的です。最初にimpl1.cpp、次にimpl2.cppの2つのステップでコンパイルし、各ユニットでコンパイラが静的データメンバーをインスタンス化します。次に、リンカが2つの関連付けられたオブジェクトファイルをリンクしようとすると、同じシンボルに対して2つの異なる定義が表示されるため、複数定義エラーが発生します。

于 2012-04-05T03:49:56.337 に答える