Несколько строк кода стоят тысячи слов:
У меня есть три простых файла: 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 ==========
Я уверен, что это ошибка VC ++ 2010, из-за следующих двух ссылок:
1, стандарт C ++ гласит: (встр. 140 из n3126)
"Объекты, объявленные const и явно не объявленные extern, имеют внутреннюю связь."
2, MSDN сообщает: (at: http://msdn.microsoft.com/en-us/library/357syhfh(VS.80).aspx)
"В C значения констант по умолчанию имеют внешнюю связь, поэтому они могут появляться только в исходных файлах. В C ++ значения констант по умолчанию имеют внутреннюю связь, что позволяет им появляться в заголовочных файлах.
Ключевое слово const также может бытьиспользуется в объявлениях указателей. "