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;
    }
    
  • 相关阅读:
    jsp文件导包 糖不苦
    java 数字和日期处理 糖不苦
    java时间的一些处理 糖不苦
    Vimdiff 使用
    C++资源不完全索引
    sprintf 函数详细解释
    C++ 时间
    C++的可移植性和跨平台开发
    Solaris下开发64位程序的注意事项
    C/C++ 数学库函数
  • 原文地址:https://www.cnblogs.com/steady/p/1971744.html
Copyright © 2011-2022 走看看