При попытках скомпилировать код из серии
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
стандартизирован и достаточно хорош для подавляющего большинства задач.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Не могу понять в чем проблемаВ код смотришь, ошибок нигде нет, они появляются при компиляции
Вводится последовательность слов (обязательно string) до встречи слова "stop" (Количество слов НЕ более 10)Вывести в алфавитном порядке
Дан строковый массив из n элементов, где n – натуральное числоНайти в этом массиве самую длинную подстроку, не содержащую цифры
Как задать при вызове QFileDialog стандартную папку, которая должна показываться?