Is there a way to use fopen_s() with GCC or at least create a #define about it?

前端 未结 6 915
遇见更好的自我
遇见更好的自我 2020-12-05 10:54

MSVC compiler says that fopen() is deprecated, and recommends the use of fopen_s().

Is there any way to use fopen_s() and stil

6条回答
  •  青春惊慌失措
    2020-12-05 11:18

    Microsoft's *_s functions are unportable, I usually use equivalent C89/C99 functions and disable deprecation warnings (#define _CRT_SECURE_NO_DEPRECATE).

    If you insist, you can use an adaptor function (not necessarily a macro!) that delegates fopen() on platforms that don't have fopen_s(), but you must be careful to map values of errno_t return code from errno.

    errno_t fopen_s(FILE **f, const char *name, const char *mode) {
        errno_t ret = 0;
        assert(f);
        *f = fopen(name, mode);
        /* Can't be sure about 1-to-1 mapping of errno and MS' errno_t */
        if (!*f)
            ret = errno;
        return ret;
    }
    

    However, I fail to see how fopen_s() is any more secure than fopen(), so I usually go for portability.

提交回复
热议问题