我正在尝试用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;
}
_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标准的下一个修订版本中删除,或者不推荐使用,然后删除。
fopen_s
仅在C11的可选边界检查库中可用。为了使用它,您需要做:
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
... // rest of program
然后用-std=c11
编译并祈祷。
因为边界检查库对编译器的支持不佳,并且我不确定gcc实际实现了多少。 C程序员之间的普遍共识似乎是,边界检查库是危险的,应避免使用-它的发行完全是一场惨败。
最好不要忘记所有有关此库的信息,而应使用fopen
。