При попытках скомпилировать код из серии
FILE* file = fopen(filename.c_str(), "w");
...
if (!file)
std::cout << "Error: " << strerror(errno) << std::endl;
...
int fd = fileno(file);
компилятор (visual studio 2017) выдает мне ошибки:
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
error C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
error C4996: 'fileno': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _fileno. See online help for details.
Что-то подобное он выдавал и на использование sprintf, но там вылечилось заменой на snprintf.
Смысл ошибок понятен, выключать их не хочется, так как они довольно полезные. Но слышал я, что предлагаемые компилятором замены не являются переносимыми функциями. Насколько это соответствует действительности (c++14, c++17)? Если они не переносимы, то какие есть альтернативы исправления кода так, чтобы ошибки исчезли (без учета отключения или подавления данных предупреждений), но с сохранением переносимости?
Функции *_s являются частью стандарта c11, а в c++, судя по cppreference, они не определены.
fopen плох исключительно тем, что не умеет обрабатывать нулевые указатели.
strerror не threadsafe, если у вас несколько потоков, будут проблемы.
fileno deprecated только в windows. Более того, posix не определяет _fileno.
Ну и раз вы говорите про c++, вопрос, зачем вам понадобился c-style io? fstream стандартизирован и достаточно хорош для подавляющего большинства задач.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники