О консистентности

Чтобы на времени компиляции убедиться в том, что у нас MS Visual C++ 2008 SP1+, нужно забабахать вот такое вот:
#if defined(_MSC_VER) && _MSC_VER == 1500 && _MSC_FULL_VER >= 150030729

Ну ладно, ну вот лично я бы две старших цифры в _MSC_VER занял бы под major версию, а две младших - под minor (сервис-паки, то-се), ну ладно, пусть будет два макроса.

Опять-таки, ладно, что MS Visual C++ 2008 это на самом деле Visual C++ 9.0, а _MSC_VER у него 1500. Ну логично же, да?

Но покажите мне пожалуйста табличку в официальной документации (на MSDN, например), где были бы перечислены версии компиляторов и против каждой версии было бы написано значение _MSC_VER и прочих макросов, важных для определения версии компилятора. blogs.msdn и social.msdn не принимаются, я хочу именно что документацию

А если эта табличка там есть (я не нашел), то какой осмысленный запрос надо вфигачить в поиск по MSDN, чтобы искомый документ оказался в первой тройке.

P.S. Нет, я не привередничаю. OpenMP в нужном мне виде правильно работает в VC++ 2010 и в 2008SP1, я и хочу чтобы оно собиралось бы с OpenMP на вышеуказанных версиях, а на более старых - и не думало бы. Аналогичный случай имеется с C++ TR1, который, вроде бы, человеческим тоже стал в 2008SP1.

P.P.S. В blogs.msdn.com, в каментах, сотрудник MS пишет что надо делать вот так:

#if defined(_MSC_VER) && (_MSC_FULL_VER > 150021022 || _MSC_FULL_VER == 150021022 && _MSC_BUILD >= 8)
       cout << "This is VC9 RTM or above." << endl;
#endif

#if defined(_MSC_VER) && (_MSC_FULL_VER > 150030729 || _MSC_FULL_VER == 150030729 && _MSC_BUILD >= 1)
cout << "This is VC9 SP1 or above." << endl;
#endif
У меня нет слов. Еще и _MSC_BUILD (которого нету в VC8/2005 и более старых).

Comments

Какие классные волшебные константы. Прямо хоть сейчас в <lj user=code-wtf> :)

Посмотрел на это сообщество, понял что половину шуток тамошних просто не понимаю. Старею, наверное.

кстати, у тебя в бложике вышестоящий коммент криво скопировался

Патамучта <lj&gt - это не HTML-тег, а хрень какая-то.

P.S. Нет, я не привередничаю. OpenMP в нужном мне виде правильно работает в VC++ 2010 и в 2008SP1

А что не так с OpenMP в VS2005? Или не используете его?
У меня просто софтина(библиотека) билдится под VS 2005/2008/2010, с OpenMP.

Да я не помню на самом деле, на 2008 RTM тестировал очень давно, кажется оно просто банально не собирается (ну и неудивительно, я прошу OpenMP 2.5+, а в 2008-м 2.0).

Подниму VM со старым VC2008 - расскажу подробнее.

Раскопки в почте показали:
1) VS2005 не понимала firstprivate, отчего OpenMP была запрещена для всех Visual C++ (2010-го тогда не было).
Тогда же проверялось на 2008-м, но "по бумаге" - нужно OpenMP 2.5, у 2008-го по бумагам 2.0, до свидания.

2) Потом появился 2010-й и там firstprivate заработала и было разрешено. В 2008 тоже это место компилируется без проблем, проверил.

3) Но есть свежий багрепорт, что VS2008+openmp - в SP1 все работает, а в RTM "имеются проблемы" без описания проблем.

По третьему пункту - выясняю, подозреваю что это как с OpenMP на маках - в single threaded app работает, а -pthread + OpenMP - источник траблов. Но опять же на маках обновился компилятор недавно, надо проверять.

И вот что мне отвечают:
It's a problem using code managed by OpenMP and running in a separated thread through QThread from Qt4 API. in digiKam libraw code run in spearated thread to not block GUI. I can see the same problem with new version of libpgf.

С 2008RTM проблема есть, с 2008SP1 и 20010 - нет.

Сам - ну не так, чтобы хрен проверишь, но здоровье дороже.

ясно