• 初试断言


    #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;
    }
    
  • 相关阅读:
    float的使用
    前端事件绑定
    serializeJson、serializeArray、serializeObject
    代码走查
    Colorpicker前端插件
    库/robfig/cron
    python打包
    最小公倍数 golang + python
    goland工具
    JavaScript操作JSON总结
  • 原文地址:https://www.cnblogs.com/steady/p/1971744.html
Copyright © 2020-2023  润新知