• 初试断言


    #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;
    }
    
  • 相关阅读:
    自动驾驶技术其实是一个美丽的谎言
    自动驾驶技术其实是一个美丽的谎言
    Shoutem旨在成为React Native移动应用领域的WordPress
    Mongodb安装
    spring mvc记录各个controller访问开始结束时间,以及耗时时间 线程安全
    python 升级
    SpringMVC的拦截器Interceptor
    使用org.apache.tools.zip实现zip压缩和解压
    使用 ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体
    Python爬虫入门教程 4-100 美空网未登录图片爬取
  • 原文地址:https://www.cnblogs.com/steady/p/1971744.html
Copyright © 2020-2023  润新知