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

问题描述 投票:0回答:2

我正在尝试用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;

}

起初,_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;

}

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

谢谢。

非常感谢,这有效!

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

}
c linux gcc fopen
2个回答
1
投票

_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标准的下一个修订版本中删除,或者不推荐使用,然后删除。


0
投票

fopen_s仅在C11的可选边界检查库中可用。为了使用它,您需要做:

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
... // rest of program

然后用-std=c11编译并祈祷。

因为边界检查库对编译器的支持不佳,并且我不确定gcc实际实现了多少。 C程序员之间的普遍共识似乎是,边界检查库是危险的,应避免使用-它的发行完全是一场惨败。

最好不要忘记所有有关此库的信息,而应使用fopen

© www.soinside.com 2019 - 2024. All rights reserved.