Я пытаюсь найти заголовок для включения 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?Microsoft Visual Studio, когда он используется в качестве компилятора C, в основном соответствует версии стандарта C 1990 года. Недавно были предприняты некоторые попытки обновить его до версии 1999 года. Они все еще сильно отстают в этом — компилятор не приближается к версии 2011 года. Если вам нужен стандартный совместимый компилятор C, вы не можете использовать VS.
Кроме того, вы, похоже, используете компилятор в режиме C ++, который не совсем помогает соответствию стандарту C … C11 и C ++ 11 не всегда совместимы.
При этом функция, которую вы запрашиваете, является частью необязательного интерфейса проверки границ, который, я считаю, очень немногие, если таковые вообще имеются, компиляторы еще не реализовали. Некоторые функции, присутствующие в интерфейсе проверки границ, существовали в VS до C11 как нестандартные расширения. Они не обязательно соответствуют стандарту.
Нет никаких гарантий, что библиотечные функции являются реентерабельными. Они могут быть или не быть потокобезопасными.
Других решений пока нет …