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

Я пытаюсь найти, какой заголовок включать для функции strerrorlen_s из C11 standard в 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?

Ответ 1

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

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

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

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