1.stdafx.h是什么
vc里用的预编译头,因为头文件不像代码文件,它不怎么改变。但是编译器每次看头文件的代码都要花很多时间,那么预编译头这玩意儿就是vc把看了以后了解到的东西全部记录下来,你下次改代码再编译的时候它就不用重新去看头文件,而是直接看它之前自己做的“笔记”就行了,加快了编译速度。
2. ZeroMemory()
介绍:
ZeroMemory宏用0来填充一块内存区域。
为了避免优化编译器的意外的影响,请使用SecureZeroMemory函数。
void ZeroMemory(PVOID Destination, SIZE_T Length);
参数:
Destination :指向一块准备用0来填充的内存区域的开始地址。
Length :准备用0来填充的内存区域的大小,按字节来计算。
返回值:无
ZeroMemory 只是将指定的内存块清零.
使用结构前清零, 而不让结构的成员数值具有不确定性, 是一个好的编程习惯
备注:
这个函数被定义为RtlZeroMemory宏。至于更多信息,请查看Winbase.h与Winnt.h这两个头文件。
ZeroMemory和memset的联系和区别:
ZeroMemory用0来填充一块内存区域,原型为:
void ZeroMemory([in] PVOID Destination,[in] SIZE_T Length);
函数memset, wmemset或者memset给字符串设置缓冲,原型为:
void memset( void *dest, int c, size_t count );
wchar_t memset(wchar_t *dest,wchar_t c,size_t count);
翻看SDK,找到头文件宏ZeroMemory的定义4 x;
#define ZeroMemory RtlZeroMemory
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
从上可以看出ZeroMemory是调用memset来实现的。
Raymond Chen在文章中写道,用ZeroMemory比“= {0}” 这样的语法更清晰,而且用后者不是所有人可以马上明白。
Richard Stevens在《UNIX网络编程》中写道,memset有个潜在的危险,它的后两个参数类型相同,但是含义大径庭, 如果不慎写反了编译时也不容易查出来;相比起源于Berkerly网络编程代码早期的bezro不是ANSIC函数,但它的两个参数更容易记忆。
为什么Microsoft code sample倾向使用ZeroMemory而不是{0}? 中写道,在windows平台下,对于数组或纯结构使用ZeroMemory是安全的,对于类,则使用构造函数,不要调用ZeroMemory。
如果要调用ZeroMemory,则只是需要加入
#define _M_AXP64 //在头文件里定义该宏
#include <windows.h>
ZeroMemory与memset区别
ZeroMemory是微软的SDK提供的,memset属于C Run-time Library,所以ZeroMemory只能用于Windows系统,memset可用于别的系统。
ZeroMemory是一个宏,只是用于把一段内存的内容置零,内部是用memset实现的,memset可将内存置成别的字符。
如果你的程序是Win32程序而且不想连接c运行时库,那就用ZeroMemory,如果需要跨平台,那就用memset
3.::在c++中什么意思
(1)表示“域操作符”
例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,
就要写成void A::f(),表示这个f()函数是类A的成员函数。
(2)直接用在全局函数前,表示是全局函数
例:在VC里,你可以在调用API 函数里,在API函数名前加::
(3)表示引用成员函数及变量,作用域成员运算符
例:System::Math::Sqrt() 相当于System.Math.Sqrt()
4. scanf及scanf_s
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
#include <stdio.h>
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a,b,sum;
printf("请输入两个整数\n");
scanf_s("%d,%d",&a,1,&b,1);
sum=a+b;
printf("%d",sum);
return 0;
}
5. swprintf
函数功能:把格式化的数据写到一个流中。
函数原型:
int swprintf(wchar_t *_String,size_t _Count,const wchar_t *_Format,...);
(参见:MSDN[1] )
所属库:在VC++6.0下可以使用stdio.h或者wchar.h
由于sprintf只能输出字符,字符串和整型数据,要输出任意类型应该用swprintf 。
// crt_swprintf_s.c
// wide character example
// also demonstrates swprintf_s returning error code
#include <stdio.h>
int main( void )
{
wchar_t buf[100];
int len = swprintf_s( buf, 100, L"%s", L"Hello world" );
printf( "wrote %d characters\n", len );
len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );
// swprintf_s fails because string contains WEOF (\xffff)
printf( "wrote %d characters\n", len );
}
6.解决_CRT_SECURE_NO_WARNINGS 警告
1>e:/project/htt/ishow/functions.cpp(156) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.解决方法:
右击工程 - 属性 - 配置属性 - C/C++ - 命令行
命令行增加 /D _CRT_SECURE_NO_WARNINGS
2014-08-06