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;
    }
    
  • 相关阅读:
    程序员跳槽到对手公司,被前老板设计陷害
    创业码农被公司套路最惨的一次经历
    记录一次由屁股决定研发的狗血经历
    不去培训班,你凭什么觉得自己能学会编程,嗯?!
    毕业生是怎么一步步给培训班骗去学编程的
    我的一次被骗去培训班狗血的经历
    不去培训班,你凭什么觉得自己能学会编程
    Phabricatori 之项目管理软件
    kvm之virt-manage 管理功能
    debian 10 安装apache 和php
  • 原文地址:https://www.cnblogs.com/steady/p/1971744.html
Copyright © 2011-2022 走看看