c++ - 为什么我不能使用 fopen?

标签 c++ c deprecated tr24731

a previous question I asked about the so-called safe library deprecations 的模具中,我发现自己同样对为什么应该弃用 fopen() 感到困惑。

该函数接受两个 C 字符串,并返回一个 FILE* ptr,如果失败则返回 NULL。线程安全问题/字符串溢出问题在哪里?还是别的什么?

提前致谢

最佳答案

可以使用fopen()。说真的,在这里不要理会微软,他们背离了 ISO 标准,对程序员造成了真正的伤害。他们似乎认为编写代码的人不知何故是脑残,不知道如何在调用库函数之前检查参数。

如果有人不愿意学习 C 编程的复杂性,那么他们真的没有生意去做。他们应该转向更安全的语言。

这似乎只是 Microsoft 对开发人员锁定供应商的又一次尝试(尽管他们不是唯一尝试这样做的人,所以我没有特别谴责他们)。我通常会添加:

#define _CRT_SECURE_NO_WARNINGS

(或命令行上的 "-D" 变体)到我的大多数项目,以确保我在编写完全有效的合法 C 代码时不会被编译器打扰。

Microsoft 在 fopen_s() 函数中提供了额外的功能(例如文件编码)以及更改返回的方式。这对于 Windows 程序员来说可能会更好,但会使代码天生不可移植。

如果您只打算为 Windows 编写代码,请务必使用它。我自己更喜欢在任何地方编译和运行我的代码的能力(尽可能少的改动)。


从 C11 开始,这些安全功能现在是标准的一部分,尽管是可选的。详情请查看附件 K。

关于c++ - 为什么我不能使用 fopen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/906599/

相关文章:

c - 如何改进这些大小写转换功能?

c - 我需要帮助找出这个算法的作用

cakephp 1.1 与 php 5.3

julia - 如何将函数标记为 `@deprecate` d?

c# - 用于重命名冲突默认值的 ProtoEnum 属性用法

c++ - 为什么 fmt 将 0.5 四舍五入到 0(小数点后为零)?

c++ - 在变量或字段 'printVector' 声明为 void 之前缺少模板参数

c - C-编译后从文件读取文本的程序崩溃

php - 跟踪标记为弃用的函数的使用

c++ - 如何计算ANSI C代码性能?