社区
工具平台和程序库 帖子详情 为什么vs编译器里面很多函数都加_s 不修边幅的胖子 2015-06-10 12:56:03 在很多书上,看到很多函数例如:strcpy,fopen,fread等函数,在dev c++上编译无误,但是在vs2013上编译就会出错,错误说这些函数不安全,需要用strcpy_s,fopen_s等替代,我在网上查了下,这是个一个全新的函数,他能有效的解决数据溢出的问题,也找到了解决方法,关闭sdl(安全生命周期)和警告,这些函数就都能用了
于是我发现了几个问题
1:像这些加_s的函数,的确更方便,但是为什么dev cpp为什么不支持这些函数呢
2:这些加_S的函数是什么函数,是c++标准库内的函数么
3:以后开发到底是用哪一种函数啊,是_s还是不带_S的,个人感觉各有各的好处
4:如果我想在dev c++中也用_S这些函数,怎么用,我用了说找不到函数
5:SDL这个检查是c++规范标准里面的么
...全文
652 7 打赏 收藏 为什么vs编译器里面很多函数都加_s 在很多书上,看到很多函数例如:strcpy,fopen,fread等函数,在dev c++上编译无误,但是在vs2013上编译就会出错,错误说这些函数不安全,需要用strcpy_s,fopen_s等替代,我在网上查了下,这是个一个全新的函数,他能有效的解决数据溢出的问题,也找到了解决方法,关闭sdl(安全生命周期)和警告,这些函数就都能用了 于是我发现了几个问题 1:像这些加_s的函数,的确更方便,但是为什么dev cpp为什么不支持这些函数呢 2:这些加_S的函数是什么函数,是c++标准库内的 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 7 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 paschen 2015-06-11 打赏举报 回复 加了_s是后面改的,是更加安全的
比如strcpy,以前的版本不会检查字符串是否写了超过申请的大小,新的strcpy_s会要求多输入一个参数,就是字符串数组的大小,函数内部会检查是否越界 innerX 2015-06-11 打赏举报 回复 我用的vs2013,可以通过设置解决这个问题。
我也用了几次ctime_s之类的,以为要重新学习新版本,后来才发现有解决方法。 赵4老师 2015-06-10 打赏举报 回复 #pragma warning(disable:4996)
flyrack 2015-06-10 打赏举报 回复 C/C++ 按规定是效率优先的
vs显然违反了C/C++程序员应该为自己的行为负责的原则 iyomumx 2015-06-10 打赏举报 回复 1.因为gcc/glibc(目前)选择不支持这些函数
2.不是C++标准库的函数,是C11标准库的可选实现
3.C++用string,C用宏定义来使用替代函数,比如
#ifndef _MSC_VER
#define gets_s(buf, sz) fgets(buf, sz, stdin)
#endif
4.也可以使用一些第三方的库,比如http://sourceforge.net/projects/safeclib/
5.不是 不修边幅的胖子 2015-06-10 打赏举报 回复 恩,如果我加SDL的话,vs2012根本有警告,也有错误,去掉的话错误消失啊 jiqiang01234 2015-06-10 打赏举报 回复 “编译错误”和“编译警告”不是相同的概念,楼主需区分这两者的区别。
带s的函数是微软编译器自带的库,其他编译器配套的库没有。
带s的函数是微软自己对标准库的扩展,不能跨平台,甚至不能跨编译器 一劳永逸解决vs编译器无法使用scanf函数 相信很多小伙伴在刚开始使用visualstdio写C语言时都会遇到scanf函数报错的问题,这是由于出于安全考虑vs编译器不支持这种函数写法。要想编译通过不外乎以下几种方法。 常见报错:如何解决 vs 编译器scanf函数报错问题? 问题来源
当我们使用vs编译器编译c语言代码,并需要用到一些非常常用的库函数的时候(如scanf)
vs编译器通常会报出如下错误:
有的时候即便报错了,程序也可以正常运行;
但有的时候就会同图中一样,程序无法运行;
出现这个错误的原因是vs编译器认为这些库函数是“不安全的”(我可真谢谢你,担duo心guan那xian么shi多,微软)
解决方法
解决这个报错问题的方法有两种
1.使用_S下标
如图所示,我们可以在库函数后面加一个_s,这时候vs就会把它认为是“安全的函数”,程序就可以正 C++ 编译器自动生成的函数详解 前言0x1 编译器为我们的类合成了哪些函数?0x2 对象到底调用了哪个函数?
前言
在定义一个 C++ 类的时候,编译器会为我们做很多事情,比如在某些情况下会为我们合成各种用于初始化、拷贝、移动、赋值操作的函数。那么 C++ 在定义一个类的时候编译器为我们生成了哪些成员函数呢?直接初始化和拷贝初始化调用的构造函数有什么区别吗?此处设计很多知识点,又杂又乱,所以在文章的开始处,我先把结论列出来。
编译器可以为我们合成默认构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、析构函数。
以上提到. c语言scanf_s函数详解,scanf_s()函数 scanf_s()或scanf()函数从标准输入读取数据,并根据格式控制字符串中的格式说明符将它们转换为一个或多个值。scanf_s()函数的原型如下:int scanf_s(const char * restrict format, . . . );scanf()函数也有一个类似的原型。scanf()和scanf_s()之间的区别是:后者需要两个参数,每个输入数据由c,s和[说明符,前者只需要一... 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明? 函数经过编译系统的翻译成汇编,函数名对应着汇编标号。
因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main
但是C++中函数名与得到的汇编代号有比较大的差别。如:由于函数重载,函数名一样,但汇编代号绝对不能一样。
为了区分,编译器会把函数名和参数类型合在一起作为汇编代号,这样就解决了重载问题。具体如何把函数名和参数类型合在一起,要看编译器的帮助说明了
工具平台和程序库
24,860
社区成员
27,333
社区内容
发帖 与我相关 我的任务 工具平台和程序库 C/C++ 工具平台和程序库 复制链接
扫一扫 分享 确定 社区描述 C/C++ 工具平台和程序库 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章