В MSVC Express 2012 пытаюсь собрать
riecoin.
При компиляции файла
addrman.cpp получаю синтаксическую ошибку в файле
addrman.hПостроение начато 21.02.2015 21:27:11.
1>Проект "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" в узле 2 (целевые объекты ClCompile).
1>ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\CL.exe /c /I..\include /I..\..\..\deps /I"..\..\..\deps\openssl-1.0.2\include" /I..\..\src\leveldb\helpers\memenv /I..\..\src\leveldb\helpers /I..\..\src\leveldb\include /I..\..\src\secp256k1\include /I"..\..\..\deps\db-6.1.19\build_windows" /I..\..\..\deps\boost_1_57_0 /I..\..\..\deps\boost_1_57_0\boost /I.\GeneratedFiles /I.\GeneratedFiles\Release /I.\ /Zi /nologo /W1 /WX- /MP /O2 /Oi /D STATICLIB /D USE_UPNP /D _CRT_SECURE_NO_WARNINGS /D UNICODE /D WIN32 /D _SCL_SECURE_NO_WARNINGS /D _WIN32_WINNT=0x0501 /D HAVE_WORKING_BOOST_SLEEP_FOR /D MINIUPNP_STATICLIB /D NOMINMAX /D BOOST_SPIRIT_THREADSAFE /D __STDC_FORMAT_MACROS /D _UNICODE /D UNICODE /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t- /Zc:forScope /Fo"x64\Release\\" /Fd"x64\Release\vc110.pdb" /Gd /TP /errorReport:prompt ..\..\src\addrman.cpp
addrman.cpp
1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): error C2143: синтаксическая ошибка: отсутствие ")" перед "{"
1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): error C2059: синтаксическая ошибка: )
1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>Построение проекта "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" завершено (целевые объекты ClCompile) с ошибкой.
Сбой построения.
Затраченное время: 00:00:03.42
Тут что-то непонятное со скобками в следующем куске кода
IMPLEMENT_SERIALIZE
(({
// serialized format:
// * version byte (currently 0)
// * nKey
// * nNew
// * nTried
// * number of "new" buckets
// * all nNew addrinfos in vvNew
// * all nTried addrinfos in vvTried
// * for each bucket:
// * number of elements
// * for each element: index
//
// Notice that vvTried, mapAddr and vVector are never encoded explicitly;
// they are instead reconstructed from the other information.
//
// vvNew is serialized, but only used if ADDRMAN_UNKOWN_BUCKET_COUNT didn't change,
// otherwise it is reconstructed as well.
//
// This format is more complex, but significantly smaller (at most 1.5 MiB), and supports
// changes to the ADDRMAN_ parameters without breaking the on-disk structure.
{
LOCK(cs);
unsigned char nVersion = 0;
READWRITE(nVersion);
READWRITE(nKey);
READWRITE(nNew);
READWRITE(nTried);
CAddrMan *am = const_cast<CAddrMan*>(this);
if (fWrite)
{
int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT;
READWRITE(nUBuckets);
std::map<int, int> mapUnkIds;
int nIds = 0;
for (std::map<int, CAddrInfo>::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++)
{
if (nIds == nNew) break; // this means nNew was wrong, oh ow
mapUnkIds[(*it).first] = nIds;
CAddrInfo &info = (*it).second;
if (info.nRefCount)
{
READWRITE(info);
nIds++;
}
}
nIds = 0;
for (std::map<int, CAddrInfo>::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++)
{
if (nIds == nTried) break; // this means nTried was wrong, oh ow
CAddrInfo &info = (*it).second;
if (info.fInTried)
{
READWRITE(info);
nIds++;
}
}
for (std::vector<std::set<int> >::iterator it = am->vvNew.begin(); it != am->vvNew.end(); it++)
{
const std::set<int> &vNew = (*it);
int nSize = vNew.size();
READWRITE(nSize);
for (std::set<int>::iterator it2 = vNew.begin(); it2 != vNew.end(); it2++)
{
int nIndex = mapUnkIds[*it2];
READWRITE(nIndex);
}
}
} else {
int nUBuckets = 0;
READWRITE(nUBuckets);
am->nIdCount = 0;
am->mapInfo.clear();
am->mapAddr.clear();
am->vRandom.clear();
am->vvTried = std::vector<std::vector<int> >(ADDRMAN_TRIED_BUCKET_COUNT, std::vector<int>(0));
am->vvNew = std::vector<std::set<int> >(ADDRMAN_NEW_BUCKET_COUNT, std::set<int>());
for (int n = 0; n < am->nNew; n++)
{
CAddrInfo &info = am->mapInfo[n];
READWRITE(info);
am->mapAddr[info] = n;
info.nRandomPos = vRandom.size();
am->vRandom.push_back(n);
if (nUBuckets != ADDRMAN_NEW_BUCKET_COUNT)
{
am->vvNew[info.GetNewBucket(am->nKey)].insert(n);
info.nRefCount++;
}
}
am->nIdCount = am->nNew;
int nLost = 0;
for (int n = 0; n < am->nTried; n++)
{
CAddrInfo info;
READWRITE(info);
std::vector<int> &vTried = am->vvTried[info.GetTriedBucket(am->nKey)];
if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE)
{
info.nRandomPos = vRandom.size();
info.fInTried = true;
am->vRandom.push_back(am->nIdCount);
am->mapInfo[am->nIdCount] = info;
am->mapAddr[info] = am->nIdCount;
vTried.push_back(am->nIdCount);
am->nIdCount++;
} else {
nLost++;
}
}
am->nTried -= nLost;
for (int b = 0; b < nUBuckets; b++)
{
std::set<int> &vNew = am->vvNew;
int nSize = 0;
READWRITE(nSize);
for (int n = 0; n < nSize; n++)
{
int nIndex = 0;
READWRITE(nIndex);
CAddrInfo &info = am->mapInfo[nIndex];
if (nUBuckets == ADDRMAN_NEW_BUCKET_COUNT && info.nRefCount < ADDRMAN_NEW_BUCKETS_PER_ADDRESS)
{
info.nRefCount++;
vNew.insert(nIndex);
}
}
}
}
}
});)
На первый взгляд как-бы лишние скобки и точка-с-запятой, показал красным. Если убираю их, то получаю
Построение начато 21.02.2015 21:47:48.
1>Проект "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" в узле 2 (целевые объекты ClCompile).
1>ClCompile:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\CL.exe /c /I..\include /I..\..\..\deps /I"..\..\..\deps\openssl-1.0.2\include" /I..\..\src\leveldb\helpers\memenv /I..\..\src\leveldb\helpers /I..\..\src\leveldb\include /I..\..\src\secp256k1\include /I"..\..\..\deps\db-6.1.19\build_windows" /I..\..\..\deps\boost_1_57_0 /I..\..\..\deps\boost_1_57_0\boost /I.\GeneratedFiles /I.\GeneratedFiles\Release /I.\ /Zi /nologo /W1 /WX- /MP /O2 /Oi /D STATICLIB /D USE_UPNP /D _CRT_SECURE_NO_WARNINGS /D UNICODE /D WIN32 /D _SCL_SECURE_NO_WARNINGS /D _WIN32_WINNT=0x0501 /D HAVE_WORKING_BOOST_SLEEP_FOR /D MINIUPNP_STATICLIB /D NOMINMAX /D BOOST_SPIRIT_THREADSAFE /D __STDC_FORMAT_MACROS /D _UNICODE /D UNICODE /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t- /Zc:forScope /Fo"x64\Release\\" /Fd"x64\Release\vc110.pdb" /Gd /TP /errorReport:prompt ..\..\src\addrman.cpp
addrman.cpp
1>d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381): warning C4002: слишком много фактических параметров для макроопределения "IMPLEMENT_SERIALIZE"
1>..\..\src\addrman.cpp(528): fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка "{" в "d:\soft\cointest\bitcoinqtmsvc2012-rie\src\addrman.h(381)"
1>Построение проекта "D:\Soft\CoinTest\bitcoinqtmsvc2012-rie\MSVC\libcommon\libcommon.vcxproj" завершено (целевые объекты ClCompile) с ошибкой.
Сбой построения.
Затраченное время: 00:00:03.38
Не понятно, почему так? Ошибка в коде или среда MSVC не справляется с таким вариантом набора скобок? Исходники
riecoin явно валидные, в Линуксе они собираются.