Я думаю, что @codeLizard спрашивает о том, как написать совместимый код для обработки всех функций, которые Microsoft устарела в пользу их защищенных версий, а не только строковых функций.
Функции, основанные на безопасных функциях Microsoft, включены в Приложение K стандарта C11, но приложение широко не поддерживается за пределами MSVS.
Вы можете написать макросы и встроенные функции во включаемом файле для сопоставления между некоторыми традиционных и безопасных версий. Я разместил набор макросов преобразования здесь , если вы хотите скопировать их, получите их с понравившейся страницы; более полные, лучшие комментарии, чем ниже.
Однако этот подход не работает для отображения традиционных функций в безопасные версии, которые принимают аргументы размера, если аргументы размера также не присутствуют в традиционных функциях. Кроме того, функции безопасности отличаются поведением исключений, а иногда и возвращаемыми значениями. Мои текущие конверсии не учитывают это. Когда у меня будет время, я постараюсь улучшить их там, где смогу. А пока я оставлю это как упражнение для читателя.
Я рекомендую использовать защищенные функции в новом коде, если вы можете, использовать решение для функции «плюс», если это необходимо, для переносимости в компиляторы не-MS, а также в качестве моста для повторного использования устаревшего кода, пока у вас не будет времени обновить его с помощью безопасные функции.
Вот сокращенная версия вышеуказанного связанного подхода макроса / встроенной функции:
#pragma once
#if !defined(FCN_S_MACROS_H)
#define FCN_S_MACROS_H
#include <cstdio>
#include <string> // Need this for _stricmp
using namespace std;
#if (defined(_MSC_VER) && (_MSC_VER >= 1400) ) // _MSC_VER==MSVC 2005
// The function plus macro strategy could be used to maintain
// consistent exception behaviors and return values.
inline extern
FILE* fcnSMacro_fopen_s(char *fname, char *mode)
{ FILE *fptr;
fopen_s(&fptr, fname, mode);
return fptr;
}
#define fopen(fname, mode) fcnSMacro_fopen_s((fname), mode))
#define fprintf(fptr, ...) fprintf_s((fptr), __VA_ARGS__)
#define fscanf fscanf_s
#define strncpy(dest, source, count) strcpy_s((dest), (count), (source))
// Can't map sprinf to sprintf_s (size argument unavailable).
// #define sprintf ???
...
#else
#define fopen_s(fp, fmt, mode) *(fp)=fopen( (fmt), (mode))
#define fprintf_s fprintf
#define fscanf_s fscanf
#define strcpy_s(dest, count, source) strncpy( (dest), (source), (count) )
...
#endif //_MSC_VER
#endif // FCN_S_MACROS_H