数行のコードは1000語の価値があります。
私は3つの単純なファイルを持っています:header.h、main.cpp、other.cpp
// header.h
#pragma once
inline const int& GetConst()
{
static int n = 0;
return n;
}
const int& r = GetConst();
// main.cpp
#include "header.h"
int main()
{
return 0;
}
// other.cpp
#include "header.h"
最も単純なプロジェクトをコンパイルするとき、VC++2010は次のように文句を言います。
ClCompile:
other.cpp
main.cpp
Generating Code...
other.obj : error LNK2005: "int const & const r" (?r@@3ABHB) already defined in main.obj
D:\Test\Debug\bug.exe : fatal error LNK1169: one or more multiply defined symbols found
Build FAILED.
Time Elapsed 00:00:00.29
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
次の2つの参照があるため、これはVC++2010のバグであると確信しています。
1、C ++標準によると:(n3126の140ページ)
「constと宣言され、externと明示的に宣言されていないオブジェクトには、内部リンクがあります。」
2、MSDNによると:(http://msdn.microsoft.com/en-us/library/357syhfh (VS.80).aspx )
「Cでは、定数値はデフォルトで外部リンケージに設定されるため、ソースファイルにのみ表示されます。C++では、定数値はデフォルトで内部リンケージに設定されるため、ヘッダーファイルに表示されます。
constキーワードは、ポインタ宣言でも使用できます。」