c/c++语言开发共享有没有办法在GCC中使用fopen_s()或者至少创建一个#define?

MSVC编译器表示不推荐使用fopen() ,并建议使用fopen_s()

有没有办法使用fopen_s()并仍然可移植?

#define任何想法?

    Microsoft的*_s函数是不可移植的,我通常使用等效的C89 / C99函数并禁用弃用警告( #define _CRT_SECURE_NO_DEPRECATE )。

    如果你坚持,你可以使用在没有fopen_s()平台上委托fopen()的适配器函数(不一定是宏! fopen_s() ,但是你必须小心地从errno映射errno_t返回代码的值。

     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; } 

    但是,我没有看到fopen_s()如何比fopen()更安全,所以我通常会寻求可移植性。

    如果您使用的是C11,则fopen_s是标准库:

    gcc你需要使用--std=C11参数。

    在C / C ++代码中,

     #ifdef __unix #define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename),(mode)))==NULL #endif 

    在Makefile中

     CFLAGS += -D'fopen_s(pFile,filename,mode)=((*(pFile))=fopen((filename),(mode)))==NULL' 

    注意成功时fopen_s返回0而fopen返回非零文件指针。 因此有必要在宏的末尾添加“== NULL”,例如:

     if (fopen_s(&pFile,filename,"r")) perror("cannot open file"); 

    Microsoft的许多安全function都包含在C11标准的附录K中,但它没有得到广泛支持,因此可移植性仍然是一个问题。 在某些应用中需要提高安全性; 也许这种支持将来会有所改善。

    我过去,我是这样做的:

      #define fopen_s(fp, fmt, mode) *(fp)=fopen( (fmt), (mode)) 

    宏是简单而直接的,对于快速和脏的东西来说足够好,但是它不提供fopen_s的exception行为,并且它不会提供真正的fopen_s函数的安全性。

    @Alex B的上述函数方法部分地再现了失败时的正确行为; 他返回errno(= EINVAL)。 他的方法可以通过生成无效参数exception来进一步扩展,以更充分地再现fopen_s的行为。

    需要了解更多c/c++开发分享有没有办法在GCC中使用fopen_s()或者至少创建一个#define?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享有没有办法在GCC中使用fopen_s()或者至少创建一个#define?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980154.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐