Обнаружение MSVC с использованием препроцессора без обнаружения clang-cl, icl, - PullRequest
3 голосов
/ 10 июня 2019

MSVC 2019 добавил новый встроенный _udiv128() ( документация ), который я хотел бы использовать в своем коде C ++.Однако эта встроенная функция в настоящее время недоступна ни в clang-cl 9.0.0, ни в компиляторе Intel C ++ 2019, хотя эти компиляторы устанавливают _MSC_VER=1920 точно так же, как MSVC 2019.

Из-за этой проблемы приведенный ниже код не компилируетсяиспользуя clang-cl и icl:

#include <immintrin.h>

#if _MSC_VER >= 1920
    uint64_t res = _udiv128(a, b, c, &d);
#endif

Есть ли способ обнаружить MSVC с помощью препроцессора без обнаружения clang-cl, icl, ... Я хотел бы избежать проверки на _MSC_VER, а затемза исключением всех других C / C ++ Windows-компиляторов.

В идеале я хотел бы обнаружить MSVC с помощью специального макроса Microsoft, который определен только для MSVC, но не для clang-cl, icl ...

1 Ответ

2 голосов
/ 10 июня 2019

Я не могу говорить за компилятор Intel.

Clang-cl определяет _MSC_VER, потому что он пытается быть заменой компилятора MSVC и использовать библиотеки MS, которые поставляются скомпилятор (например, C RTL и стандартная библиотека C ++).Эти реализации библиотеки зависят от _MSC_VER, поэтому у clang-cl на самом деле нет опции.

Опции:

  1. Предложение Севы из комментариев будет работать для вас,Я понимаю, что это не ваше предпочтительное решение, но это вариант.Вы можете проверить его в одном месте, так что вам нужно будет обновить только одно место, когда ситуация улучшится.

  2. Попробуйте использовать флаг -fms-compatibility-version clang-cl, чтобы выбрать более старую версию.(Если вы не укажете этот флаг, clang-cl попытается обнаружить вашу установку MSVC, а затем сопоставит флаг совместимости с этими библиотеками установки, вероятно, именно поэтому вы видите именно 1920.) Это предотвратит ваш #if _MSC_VER >= 1920 отзапуск, но он может иметь побочные эффекты, если есть части системных библиотек, которые требуют 1920 или более.

  3. Подождите, пока clang-cl реализует _udiv128().А еще лучше, предложите патч, чтобы сделать это раньше.

...