目录

第1章说明    1

1.1 _CRT_NONSTDC_NO_WARNINGS    1

1.2 _CRT_NON_CONFORMING_SWPRINTFS    2

1.3 _CRT_SECURE_NO_WARNINGS    3

1.4 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES    4

1.5 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES    5

第1章说明

1.1 _CRT_NONSTDC_NO_WARNINGS

使用VC++2008编译如下代码:

#include <windows.h>

#include <tchar.h>

#include <math.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

hypot(3,4);

return 0;

}

将收到如下警告信息:

warning C4996: 'hypot': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _hypot. See online help for details.

错误原因:hypot函数是符合POSIX标准的函数,在VC++2008下这个标准已经过时,被ISO C++取代。在ISO C++标准下,该函数的名称为_hypot。

解决方法有两个:

方法一:把hypot更改为_hypot。如:#define hypot _hypot

方法二:定义宏_CRT_NONSTDC_NO_WARNINGS或_CRT_NONSTDC_NO_DEPRECATE。更改后的代码如下:

#define _CRT_NONSTDC_NO_WARNINGS

#include <windows.h>

#include <tchar.h>

#include <math.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

hypot(3,4);

return 0;

}

说明:

1、#define _CRT_NONSTDC_NO_WARNINGS必须在#include语句之前;

2、#define _CRT_NONSTDC_NO_DEPRECATE 与 #define _CRT_NONSTDC_NO_WARNINGS 完全等效。

1.2 _CRT_NON_CONFORMING_SWPRINTFS

使用VC++2008编译如下代码:

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

wchar_t wzStr[32];

swprintf(wzStr,L"%d",10);

return 0;

}

将收到如下警告信息:

warning C4047: 'function' : 'size_t' differs in levels of indirection from 'unsigned short [3]'

warning C4024: 'swprintf' : different types for formal and actual parameter 2

warning C4047: 'function' : 'const wchar_t *' differs in levels of indirection from 'int'

warning C4024: 'swprintf' : different types for formal and actual parameter 3

错误原因:swprintf的声明被更改了!

下面是VC++6.0里swprintf的声明

int swprintf(wchar_t *buffer, const wchar_t *format,...);

下面是VC++2008里swprintf的声明

int swprintf(wchar_t *buffer,size_t count,const wchar_t *format,...);

可见后者多了一个参数size_t count。

解决方法有两个:

方法一:逐个修改swprintf函数。工作量大不说,遇到_stprintf函数时还得分两种情况更改代码。而且最重要的是更改之后VC++6.0就无法编译了;

方法二:定义宏 _CRT_NON_CONFORMING_SWPRINTFS,继续沿用老版本的swprintf。更改后的代码如下:

#define _CRT_NON_CONFORMING_SWPRINTFS

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

wchar_t wzStr[32];

swprintf(wzStr,L"%d",10);

return 0;

}

1.3 _CRT_SECURE_NO_WARNINGS

使用VC++2008编译如下代码:

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

char szBuf[10];

strcpy(szBuf,"test");

return 0;

}

将收到如下警告信息:

warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

错误原因:VC++2008认为strcpy函数不安全,建议您将其替换为strcpy_s函数。

解决方法有两个:

方法一:逐个修改strcpy为strcpy_s,工作量比较大;

方法二:定义宏 _CRT_SECURE_NO_WARNINGS或_CRT_SECURE_NO_DEPRECATE,继续使用不安全的strcpy函数。更改后的代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

char szBuf[10];

strcpy(szBuf,"test");

return 0;

}

1.4 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES

上一节只是把strcpy的警告信息去除了,现在想把strcpy都替换为安全的strcpy_s函数,有什么快捷的方法?答案就是使用宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES和_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT。

参考下面的代码:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

#include <string.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

char szBuf[10];

strcpy(szBuf,"test");

strncpy(szBuf,"test",10);

return 0;

}

说明:

1、因为定义了宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 为1,因此strcpy会被替换为strcpy_s(szBuf,sizeof(szBuf),"test");

2、因为定义了宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT为1,因此strncpy(szBuf,"test",10);会被替换为strncpy_s(szBuf,sizeof(szBuf),"test",10);

3、这种替换方法只适用于静态数组,不适用于动态数组;

4、这两个宏只能用于C++代码,对于C代码是没有任何作用的。

1.5 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES

参考下面的代码:

#include <windows.h>

#include <tchar.h>

#include <stdio.h>

#include <string.h>

int WINAPI _tWinMain(HINSTANCE hInstance

,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)

{

char szBuf[10];

strcpy_s(szBuf,"test");

return 0;

}

strcpy_s需要三个参数,上面的代码里只有两个(程序员不熟悉strcpy_s,把它当成strcpy用)。为什么编译时没有提示错误?

因为宏_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES在默认情况下被定义为1,在这种情况下编译器会自动给strcpy_s添加缺失的参数,即修改strcpy_s(szBuf,"test");为strcpy_s(szBuf,sizeof(szBuf),"test");

说明:

1、这种替换方法只适用于静态数组,不适用于动态数组;

2、这个宏只能用于C++代码,对于C代码是没有任何作用的;

3、既然决定使用安全函数,最好还是把_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES定义为0,让编译器严格检查安全函数的各个参数。

_CRT_NONSTDC…与_CRT_SECURE…的更多相关文章

随机推荐

  1. jquery简单插件到复杂插件(1)--tabs

    写在前面,到了新公司开始转做前段,之前一直写php,一共写了半年,转过来,jq都用不好,但是还是得不断的学习,谁没菜过.从最简单的开始写,最近也在学习些html5的小游戏,加油吧.js原生写的可以说惨 ...

  2. Educational Codeforces Round 16 B

    Description You are given n points on a line with their coordinates xi. Find the point x so the sum ...

  3. Repeater删改

    一.Repeater删改 中心思路:点击"删除"链接,跳转到"删除"网页,在"删除"网页里面执行删除方法,然后再返回主界面,根据删除界面返回 ...

  4. shell中awk用法

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  5. MyBatis的返回参数类型和查询结果遍历

    MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...

  6. <转>如何改变讨好型人格 | 你根本不需要讨好任何人

    在我过去二十多年的生命里一直是一个“讨好者”. 我总是活在别人对我的期待中,我总是不停的追逐着别人对我的认可,我总是像个卑微的奴才一样去满足别人的需求. 但就和大多数的“讨好者”一样,我们越是寻求别人 ...

  7. 【转载】理解C语言中的关键字extern

    原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...

  8. HQL语句大全(转载)

    Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...

  9. [HDOJ3308]LCIS(线段树,区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意:给定n个数,两个操作: U A B:将位置A的数值改成B Q A B:查询[A,B]内最长 ...

  10. [JAVA设计模式]第四部分:行为模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...