Visual studio 编译记录

本文介绍了Visual Studio中的预编译头文件stdafx.h的作用,用于提高编译速度。同时讲解了ZeroMemory()宏与memset的区别,指出ZeroMemory在Windows下的使用场景。还探讨了C++中的作用域操作符::的意义,并提到了安全的输入函数scanf_s。最后,给出了消除_CRT_SECURE_NO_WARNINGS警告的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值