При попытках скомпилировать код из серии
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
)? Если они не переносимы, то какие есть альтернативы исправления кода так, чтобы ошибки исчезли (без учета отключения или подавления данных предупреждений), но с сохранением переносимости?