Отсутствует функция C11 strerrorlen_s под MSVC 2017

Я пытаюсь найти заголовок для включения strerrorlen_s функция от Стандарт С11 под MSVC 2017. Мне это нужно для выделения места для сообщения об ошибке, чтобы получить с strerror_s, Код следующий:

auto size = strerrorlen_s(errno) + 1;
char* errorReason = (char*)alloca(size);
strerror_s(errorReason, size, errno);
std::ostringstream oss;
oss << "Cannot open: " << fileName << " Reason: " << errorReason;
throw std::runtime_error(oss.str());

В документации есть следующие слова:

Как и для всех функций с проверкой границ, strerror_s и strerrorlen_s гарантированно будут доступны только в том случае, если __STDC_LIB_EXT1__ определяется реализацией, и если пользователь определяет __STDC_WANT_LIB_EXT1__ к целочисленной константе 1 перед включением string.h,

MSVC 2017 не определяет __STDC_LIB_EXT1__ и кажется, что определяющий __STDC_WANT_LIB_EXT1__ перед включением string.h не имеет эффекта Хотя strerror_s доступен.

  • Является strerrorlen_s доступно под Windows с MSVC 2017?
  • Можно ли каким-то другим способом получить длину сообщения об ошибке, если функция недоступна?
  • Является strerror_s потокобезопасен под Windows, потому что кажется, что под Linux это не так и strerror_r должен использоваться, если есть потребность в безопасности потока, но это не доступно на Windows?

12

Решение

Microsoft Visual Studio, когда он используется в качестве компилятора C, в основном соответствует версии стандарта C 1990 года. Недавно были предприняты некоторые попытки обновить его до версии 1999 года. Они все еще сильно отстают в этом — компилятор не приближается к версии 2011 года. Если вам нужен стандартный совместимый компилятор C, вы не можете использовать VS.

Кроме того, вы, похоже, используете компилятор в режиме C ++, который не совсем помогает соответствию стандарту C … C11 и C ++ 11 не всегда совместимы.

При этом функция, которую вы запрашиваете, является частью необязательного интерфейса проверки границ, который, я считаю, очень немногие, если таковые вообще имеются, компиляторы еще не реализовали. Некоторые функции, присутствующие в интерфейсе проверки границ, существовали в VS до C11 как нестандартные расширения. Они не обязательно соответствуют стандарту.

Нет никаких гарантий, что библиотечные функции являются реентерабельными. Они могут быть или не быть потокобезопасными.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]