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