zoukankan      html  css  js  c++  java
  • 初试断言

    #include <stdio.h>
    #include <stdlib.h>
    
    //#define NDEBUG	//禁用NDBUG
    #include <assert.h>
    typedef unsigned char byte;
    
    #define DEBUG	//自定义的断言宏
    
    
    /* memcpy ─── 拷贝不重叠的内存块*/
    void* memcpy(void* pvTo, void* pvFrom, size_t size)
    {
    	byte* pbTo = (byte*)pvTo;
    	byte* pbFrom = (byte*)pvFrom;
    	if(pvTo == NULL || pvFrom == NULL)
    	{
    		fprintf(stderr, "Bad args in memcpy\n");
    		abort();
    	}
    	while(size-->0)
    		*pbTo++ = *pbFrom++;
    	return(pvTo);
    }
    
    
    
    void* memcpy2(void* pvTo, void* pvFrom, size_t size)
    {
    	byte* pbTo = (byte*)pvTo;
    	byte* pbFrom = (byte*)pvFrom;
    #ifdef DEBUG
    	if(pvTo == NULL || pvFrom == NULL)
    	{
    		fprintf(stderr, "Bad args in memcpy\n");
    		abort();
    	}
    #endif
    	while(size-->0)
    		*pbTo++ = *pbFrom++;
    	return(pvTo);
    }
    
    
    void* memcpy3(void* pvTo, void* pvFrom, size_t size)
    {
    	byte* pbTo = (byte*)pvTo;
    	byte* pbFrom = (byte*)pvFrom;
    	assert(NULL != pvTo && NULL != pvFrom );
    	while(size-->0)
    		*pbTo++ = *pbFrom++;
    	return(pvTo);
    }
    
    
    
    #ifdef DEBUG
    void _Assert(char* , unsigned); /* 原型*/
    #define ASSERT(f) \
    	if(f) \
    	NULL; \
    	else \
    	_Assert(__FILE__ , __LINE__)//这个宏定义不能放在表达式当中
    #else
    #define ASSERT(f) NULL
    #endif
    
    void _Assert(char* strFile, unsigned uLine)
    {
    	fflush(stdout);
    	fprintf(stderr, "\nAssertion failed: %s, line %u\n",strFile, uLine);
    	fflush(stderr);
    	abort();
    }
    
    void* memcpy4(void* pvTo, void* pvFrom, size_t size)
    {
    	byte* pbTo = (byte*)pvTo;
    	byte* pbFrom = (byte*)pvFrom;
    	ASSERT(NULL != pvTo && NULL != pvFrom );
    	while(size-->0)
    		*pbTo++ = *pbFrom++;
    	return(pvTo);
    }
    
    
    /* memcpy ─── 拷贝不重叠的内存块*/
    void* memcpy5(void* pvTo, void* pvFrom, size_t size)
    {
    	byte* pbTo = (byte*)pvTo;
    	byte* pbFrom = (byte*)pvFrom;
    	ASSERT(NULL != pvTo && NULL != pvFrom );	//要使用断言对函数参数进行确认
    	ASSERT(pbFrom+size <= pbTo || pbTo+size <= pbFrom);	/* 内存块重叠吗?如果重叠,就使用memmove */
    	while(size-->0)
    		*pbTo++ = *pbFrom++;
    	return(pvTo);
    }
    
    
    const int len = 20;
    
    int main()
    {
    	char *pchFrom = new char[len];
    	pchFrom[0] = 's';
    	pchFrom[1] = '\0';
    	char *pchTo = NULL;
    	//memcpy3(pchTo, pchFrom,len);
    	//memcpy4(pchTo, pchFrom,len);
    	memcpy5(pchTo, pchFrom,len);
    	return 0;
    }
    
  • 相关阅读:
    C#一些定义
    顺序
    针对IE8的css hack
    js 数字,金额 用逗号 隔开。数字格式化
    Ubuntu下使用Vi是方向键变乱码 退格键不能使用的解决方法
    UBUNTU中如何获得root权限
    区分IE8 、IE9 的专属css hack
    ubuntu 安装 Sublime Text 2
    PHP执行zip与rar解压缩方法
    使用ThinkPHP时,双引号导致插入数据库经过转义的处理
  • 原文地址:https://www.cnblogs.com/steady/p/1971744.html
Copyright © 2011-2022 走看看