3

次の定義を含むヘッダー ファイルがあります。

const std::string error[] = {"a", "b"};

現在、このファイルを 2 つの異なる翻訳単位に含めて、ソース コードをコンパイルしています。すべてが機能しますが、なぜですか?これは壊れると予想されone definition ruleます。

さらに興味深いことに、タイプを変更しています

const char* error[] = {"a", "b"};

これが予想されるエラーです

multiple definition of `error'

intcharshortおよびその他の整数型のstd::string と同じように機能します。これは何ですか?

4

3 に答える 3

12

const名前空間スコープの変数に内部リンケージを提供します。これが機能する理由であり、効果的には

static const std::string error[] = {"a", "b"};

const である変数ではなく、charそれを構成する s であるため、2 つ目は機能しません。

于 2013-11-25T14:37:56.410 に答える
2

宣言されたグローバル変数にはconst、あたかも宣言されているかのように、内部リンケージがありstaticます。異なる翻訳単位で同じ名前の内部変数を定義できるため、最初の例でそれが起こります。ヘッダーを含む各単位は、配列の独自のコピーを取得します。

2 番目の例はそうではありませんconst。ポインターは定数オブジェクトを指していますが、それ自体は変更可能です。したがって、この配列には外部リンクがあり、One Definition Rule の対象となります。

于 2013-11-25T14:41:10.880 に答える
0

MSDNから

C では、定数値はデフォルトで外部リンケージに設定されるため、ソース ファイルでのみ使用できます。C++ では、定数値はデフォルトで内部リンケージに設定されるため、ヘッダー ファイルに表示できます。

于 2013-11-25T14:42:10.597 に答える