vs系列的IDE中,使用scanf等函数会收到编译器警告warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.这里讲到可以使用_CRT_SECURE_NO_WARNINGS消除警告。这里有一个奇怪的现象。
如果代码是
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
编译正常。的确成功消除警告。
但是有的新手加宏的时候是这样写的
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
这时候编译依然会出现警告。
好奇心驱使我围观一下这个宏是怎么返回作用的。#include<stdio.h> 上面右键 可以打开这个文档
然后,我们可以找到 scanf函数的声明
这里有几个宏,部分宏和要讲的内容无关。这里不做展开,有兴趣的同学可以单独探索。
我们要讲的是这个宏: _CRT_INSECURE_DEPRECATE 全文件最靓的仔。可以鼠标选中,然后按下 F12。
能看到这个宏的完整实现:
#ifdef _CRT_SECURE_NO_WARNINGS
#define _CRT_INSECURE_DEPRECATE(_Replacement)
#else
#define _CRT_INSECURE_DEPRECATE(_Replacement) _CRT_DEPRECATE_TEXT( \
"This function or variable may be unsafe. Consider using " \
#_Replacement \
" instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. " \
"See online help for details.")
#endif
如果,有定义宏 _CRT_SECURE_NO_WARNINGS,那么
#define _CRT_INSECURE_DEPRECATE(_Replacement)
于是 _CRT_INSECURE_DEPRECATE(scanf_s) 展开就是空的
如果没有定义宏 _CRT_SECURE_NO_WARNINGS
那么
#define _CRT_INSECURE_DEPRECATE(_Replacement) _CRT_DEPRECATE_TEXT( \
"This function or variable may be unsafe. Consider using " \
#_Replacement \
" instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. " \
"See online help for details.")
于是 _CRT_INSECURE_DEPRECATE(scanf_s) 展开就是
_CRT_DEPRECATE_TEXT( \
"This function or variable may be unsafe. Consider using " \
"scanf_s" \
" instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. " \
"See online help for details.")
这里我们看到一个新的宏,_CRT_DEPRECATE_TEXT。按照之前的做法,按下F2,可以看到 :
这是什么东西?老实说我也看不懂,不过不要紧, 我们有万能的网络。
不过在这里,我提供一种网络以外的做法。我们可以自己试试 。
于是
骚操作出现了,咳咳,现在可以玩玩编译提示了。