当前位置:C++技术网 > 资讯 > 安全版函数、字符编码和预编译错误提示问题总结

安全版函数、字符编码和预编译错误提示问题总结

更新时间:2015-06-25 18:00:08浏览次数:1+次

    安全版函数说明
    一些函数如复制字符串函数,连接字符串函数等函数,通常使用的函数属于最普通,因此也就没有安全保障。比如说strcpy()函数,即使写成strncpy()这个版本,是可以保证安全的,但是在VS编译环境中,这样的函数还是不放心,因此在Release版本的编译时仍然会警告,不给通过。提示中说建议用strncpy_s()版本替换不安全版本,其实就是在这些不安全版本函数名后面加上下划线和s字母就成为了安全版本。这样可以确保万无一失。或者如果你希望不要提示警告,你可以使用_CRT_SECURE_NO_WARNINGS去掉提醒,在项目-》属性-》C/C++  -》预处理器-》预处理器定义:在框中输入。每一项之间用英文分号相隔,如WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)。或者点击下拉箭头,选择编辑,回车换行后输入,确定即可。其他的方法操作起来复杂又不太可靠,就用这个即可解决问题。
    形成使用安全版函数的习惯,使程序移植性更大,也更安全。安全版函数就是多了一个指定变量大小的参数,用sizeof(变量名)即可,一般是左边的参数的大小。

    编码问题
    在编程中,经常出现ANSI和Unicode编码模式的问题,VS默认是Unicode。ANSI对应的是一般的字符,而Unicode对应的是宽字符。
    char是一般的字符型,wchar_t是宽字符型;
    如果用char或者wchar_t去定义数组,在一些函数中只接受宽字符或者一般字符,而传进去的字符就会按照函数所认为的类型处理,结果可能将一般字符处理成宽字符,或者把宽字符处理成一般字符而出错。
    而微软把这些函数都通过宏的方式处理成通用的形式,TCHAR表示字符类型,_t开头的函数为通用的函数,其实在编译时根据设定的编码模式,进行自动匹配,因此就不用程序员自己每次去调用不同版本的函数,降低了出错的几率。但是如果不养成这种定义方式,则会承担更多的责任和惩罚,程序经常出现错误。但是如果你了解的够多,能够将这些处理的很妥当,可以用具体的类型直接处理,再处理前提供两个版本的函数定义,并判断编码模式然后进行编码模式对应的处理即可完成。不过这个需要一定的水平,如果处理不好,还是有很多问题。初学者建议直接用通用模式的定义法。顺便提一下,数值字符串转换成数字的atoi版本为_ttoi(),字符串长度统计的strlen版本为_tcslen(),字符串连接版本为_tcscat()。就是在前面用_t开头,cs表示字符串,后面的为函数名的缩写。

    预编译的问题
    warning C4627: “#include "test.h"”: 在查找预编译头使用时跳过
    在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
    这一个错误提示经常在复制人家代码到自己的工程中出现,问题的原因就是那些代码不是MFC的,是自己写的,不依赖于MFC,但是用在MFC中可能就会有需要MFC框架的支持,因此提示是否忘记了添加这个指令。只要把这个指令写到该文件的最顶上即可。