Многие из безопасных функций Microsoft включены в Приложение K стандарта C11, но они широко не поддерживаются, поэтому переносимость все еще остается проблемой. Существует необходимость в улучшенной безопасности в некоторых приложениях; возможно, поддержка улучшится в будущем.
Я в прошлом, я сделал это так:
#define fopen_s(fp, fmt, mode) *(fp)=fopen( (fmt), (mode))
Макрос прост и понятен, достаточно хорош для чего-то быстрого и грязного, но он не обеспечивает исключительного поведения fopen_s и не обеспечивает безопасность реальной функции fopen_s.
@ Функциональный подход Алекса Б выше частично воспроизводит правильное поведение при сбое; он возвращает errno (= EINVAL). Его подход может быть расширен за счет генерации недопустимого исключения параметра для более полного воспроизведения поведения fopen_s.