Переносимость *_s функций (_CRT_SECURE_NO_WARNINGS)

187
15 февраля 2018, 15:33

При попытках скомпилировать код из серии

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

Answer 1

Функции *_s являются частью стандарта c11, а в c++, судя по cppreference, они не определены.

fopen плох исключительно тем, что не умеет обрабатывать нулевые указатели.

strerror не threadsafe, если у вас несколько потоков, будут проблемы.

fileno deprecated только в windows. Более того, posix не определяет _fileno.

Ну и раз вы говорите про c++, вопрос, зачем вам понадобился c-style io? fstream стандартизирован и достаточно хорош для подавляющего большинства задач.

READ ALSO
Ошибки при компиляции с библиотекой boost

Ошибки при компиляции с библиотекой boost

Не могу понять в чем проблемаВ код смотришь, ошибок нигде нет, они появляются при компиляции

272
осортировать слова по алфавиту (с++)

осортировать слова по алфавиту (с++)

Вводится последовательность слов (обязательно string) до встречи слова "stop" (Количество слов НЕ более 10)Вывести в алфавитном порядке

210
поиск подстроки без цифр

поиск подстроки без цифр

Дан строковый массив из n элементов, где n – натуральное числоНайти в этом массиве самую длинную подстроку, не содержащую цифры

248
QFileDialog стандартная папка

QFileDialog стандартная папка

Как задать при вызове QFileDialog стандартную папку, которая должна показываться?

224