我正在使用 Linux,使用 gcc 编译,出现错误:警告:函数“fopen_s”的隐式声明,有人可以帮我解决这个问题吗?

Ric*_*Man 0 c linux gcc fopen tr24731

我正在尝试用 c 语言编写一个简单的边缘检测程序。我使用的是 Red Hat Enterprise Linux Server 7.7 (Maipo) 和 gcc 版本 4.8.5。

这是代码的开头:

#include <stdio.h>

#define size 200

int _tmain(int argc, _TCHAR* argv[])
{
    char filein[size] = "./image.bmp";

    FILE *fin;

    fopen_s(&fin, filein, "rb");

return 0;

}
Run Code Online (Sandbox Code Playgroud)

我最初对 _TCHAR* 有很多问题,所以最终我用 char 替换了它,我不知道这以后是否会成为问题,但至少它编译并消除了这些错误。现在我收到隐式声明警告。我尝试通过添加其他#include 来修复它。

我尝试用以下方法修复它:

#include <stdio.h>
#include <errno.h>
#include <string.h>

#define size 200

int main(int argc, char* argv[])
{
    char filein[size] = "./image.bmp";

    FILE *fin;

    fopen_s(&fin, filein, "rb");

return 0;

}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到同样的警告,有人可以告诉我我做错了什么吗?

谢谢。

非常感谢,这有效!

#include <stdio.h>

#define size 200

int main(int argc, char* argv[])
{

    char filein[size] = "./image.bmp";

    FILE *fin;

    fin = fopen(filein, "rb");

return 0;

}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ons 5

这一_s系列函数是 C 标准附录 K 中的可选函数,很少有任何 C 实现会费心去实现附录 K。附录 K 中引入的“安全”函数的实际用途存在很大争议;只需放弃这些函数并使用标准函数,例如fopen.

我唯一一次遇到这些_s函数是在为 Windows 编写的代码中,并且 Microsoft 包含了这些函数自己的版本,但不符合附录 K 中规定的标准。

请参阅此处查看附件 K 实用性的研究:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm

他们的结论是:

尽管自最初提案提出已有十多年,自 ISO/IEC TR 24731-1:2007 批准以来已近十年,自将边界检查接口引入 C 标准以来已近五年,但尚未出现可行的符合性实现。API 仍然存在争议,实施者也继续拒绝实施请求。

边界检查接口的设计虽然用意良好,但存在太多需要纠正的问题。人们发现,与依赖现有方法或现代技术相比,使用 API 会导致质量更差、安全性更差的软件。更有效和更少侵入性的方法已经变得司空见惯,并且通常受到用户和安全专家的青睐。

因此,我们建议附件K要么从C标准的下一个修订版中删除,要么弃用然后删除。

  • 微软正在使用其混乱的非标准版本,同时在使用记录良好、完全安全的标准函数时显示混乱的警告。也许全世界的 C 程序员可以在每天晚上 C2x 社区会议之前举办筹款活动,为 MS 人员安排“大量”免费酒水?:) (2认同)
  • 也许我们可以在 Microsoft 中安装一个休眠代理,以消除这些编译器警告,并为其不合格的函数添加新的警告,告诉用户改用常规函数。当我们这样做时,还要使他们的编译器符合 C99 和 C11。说实话,C99 已经存在了二十多年了;是时候了。 (2认同)