zoukankan      html  css  js  c++  java
  • 常用宏或函数的实现

    _T,_L宏:

    #define unsigned short L
    #define _T(x)       __T(x)
    #define _TEXT(x)    __T(x)

    #ifdef  _UNICODE
    #define __T(x) L##x     
    #else
    #define __T(x) x          
    #endif

    #define _L(x) L##x

    assert宏实现:
    #define assert(expr)
    do{
        if (!(expr))
        {
                outputx("Assertion failed! %s, %s, %s, line %d ",
                                #expr, __FILE__, __func__, __LINE__);
            }
    }while(0)
    assert函数实现:
    inline bool Assert(bool result, const char* function, const char* file,  
                           int line, const char* expression)
    {  
        if (!result)
        {  
                Log_Assert(function, file, line, expression);  
                Break();  
                return false;  
        }  
        return true;  
    }

    得到指定地址上的一个字节或字:
    #define  MEM_B(x) (*((byte *)(x)))
    #define  MEM_W(x) (*((word *)(x))  

    得到一个变量的地址(word宽度):
    #define B_PTR(var)  ((byte *) (void *) &(var))
    #define W_PTR(var)  ((word *) (void *) &(var))

    得到一个字的高位和低位字节:
    #define WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))
    #define WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

    将一个字母转换为大写:
    #define UPCASE(c) (((c)>='a' && (c) <= 'z') ? ((c) - 0x20) : (c))

    防止溢出的一个方法:
    #define INC_SAT(val) (val=((val)+1>(val)) ? (val)+1 : (val))

    DEBUG宏:
    #ifdef _DEBUG
    #define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
    #else
    #define DEBUGMSG(msg,date)
    #endif

    2.字符串相关函数
    int _strlen(const char* src)
    {
        assert(src != NULL);
          const char *p = src;
          while(*p++!=NULL);
          return p - str - 1;
    }

    char* _strstr(const char* str, const char* sub)
    {
        for(int i=0; str[i]!=''; i++)
        {
            int pos = i,j=0;
            while(str[i]==sub[j] && sub[j]!='')
            {
                ++i;
                ++j;
            }
            if(sub[j] == '')
                return &str[pos];
        }    

        return NULL;
    }

    char* _strncpy(char* dest, const char* src, int count)
    {
        assert(dest!=NULL && src!=NULL && count>0);
        char* tmp = dest;
        while(count-->0 && (*dest++=*src++)!='');
        return tmp;
    }

    char* _strcpy(char* dest, const char* src)
    {
        assert(dest!=NULL && src!=NULL);
        char* tmp = dest;
        while((*dest++=*src++) != '');
        return tmp;
    }

    int _strcmp(const char* first, const char* second)
    {
        assert(first!=NULL && src!=second);
        int ret = 0;

        while(!(ret=(*(unsigned char*)first) - (*(unsigned char*)second))
            && (*first != ''))
        {
            ++first;
            ++second;
        }

        if(ret < 0)
            ret = -1;
        else if(ret > 0)
            ret = 1;
        
        return ret;
    }

    char* _strcat(char* dest,char* src)
    {
        assert(dest!=NULL && src!=NULL);
        char* tmp = dest;

        while(*dest != '')
            ++dest;
        while(((*dest++)=(*src++)) != '');
        return tmp;
    }

    void _loopmove(char* str, int steps)
    {
        int n = strlen(str)-steps;
        char tmp[256];
        memcpy(tmp,str+n,steps);
        memcpy(str+steps,str,n);
        memcpy(str,tmp,steps);
    }

    char* _reversestring(char* src)
    {
        assert(src!=NULL);
        int len=strlen(src);
        char tmp = '';
        
        for(int i=0; i<len/2; i++)
        {
            tmp = src[i];
            src[i] = src[len-i-1];
            src[len-i-1] = tmp;
        }
        return src;
    }

    void _makepath(char* path, const char* drive, const char* dir, const char*filename, const char* ext)
    {
        assert(path!=NULL && drive!=NULL && filename!=NULL && ext!=NULL);

        register const char* p;
        if(*drive)
        {
            *path++ = *drive;
            *path++ = ':';
            *path++ = '\';
        }
        else
            return;

        if((p=dir) && *p)
        {
            do
            {
                *path++ = *p++;
            }while(*p);
            if(*(p-1) != '\')
                *path++ = '\';
        }
        
        if(p = filename)
        {
            while(*p)
                *path++ = *p++;
        }

        if(p = ext)
        {
            if(*p && *p != '.')
                *path++ = '.';
            while(*path++ = *p++);
        }

        *path++ = '';
    }

    3.内存相关函数
    void* _memset(void* dest, int c,int count)
    {
        assert(dest != NULL);
        char* tmp = (char*)dest;
        int i = 0;
        
        while(count--)
            dest[i++] = c;

        return tmp;
    }

    void _memcpy(void* dest, const void* src, int count)
    {
        assert(dest!=NULL && src!=NULL);
        unsigned char* pdst = (unsigned char*)dest;
        unsigned char* psrc = (unsigned char*)src;
        assert(!(psrc<=pdst && pdst<psrc+count));
        assert(!(pdst<=psrc && psrc<pdst+count));

        while(count--)
            *pdst++ = *psrc++;     
    }

    4.类型转换函数
    void _itoa(long num,char str[],int radix)  
    {  
        if( str == NULL)
            return;
        long sign = num,i = 0,j = 0;  
            char temp[100];  
     
            if(sign < 0)  
                num = -num;  
       
            do  
            {  
                temp[i] = num % radix+'0';  
                num /= radix;  
                i++;  
            }while(num > 0);  
        
        if(sign < 0)  
                temp[i++] = '-';    
            temp[i] = '';  
            i--;   
     
            while(i >= 0)  
            {  
                str[j] = temp[i];  
                j++;  
                i--;  
            }  
            str[j] = '';  
    }

    /* 此程序的不足就是很多情况下ndigit是未知的,小数位数也不确定,

    这个时候就不好处理,但是可以计算出ndigit的大小或设定保留位数 */
    void _ftoa(float number,int ndigit,char buf[])
    {
        assert(buf!=NULL);
        
        long int_part;  
            double float_part;  
            char str_int[512];  
            char str_float[256];  
            memset(str_int,0,512);  
            memset(str_float,0,256);  
            int_part = (long)number;  
            float_part = number - int_part;  
            _itoa(int_part,str_int,10);  
     
           if(ndigit>0)  
            {  
                float_part =fabs(pow(10,ndigit)*float_part);  
                _itoa((long)float_part,str_float,10);  
            }  
            int i = strlen(str_int);  
            str_int[i] = '.';  
            strcat(str_int,str_float);  
            strcpy(buf,str_int);  
    }

    int _atoi(const char str[])  
    {  
            int ret_Integer = 0;  
            int integer_Sign = 1;  
          
            if(str == NULL)  
                return 0;   

            while(*str == ' ')  
                str++;  

            if(*str == '-')  
                integer_Sign = -1;  
        
            if(*str == '-' || *str == '+')  
                str++;   

            while(*str >= '0' && *str <= '9')  
            {  
                ret_Integer = ret_Integer * 10 + *str - '0';  
                str++;  
            }  
            ret_Integer = integer_Sign * ret_Integer;  
          
            return ret_Integer;  
    }

    float _atof(const char str[])    
    {  
        if(str == NULL)  
                return 0.0;
     
            int len = strlen(str),i = 0;  
            if(str[0] == '-')  
            i++;  
          
            float s = 0.0;  
            while(i < len && (str[i]>='0' && str[i]<='9'))  
            {  
                s = s * 10 + (float)(str[i]-'0');  
                i++;  
            }  
              
            if(str[i] == '.')
            i++;  
            else
            return s;  
          
            float order = 1.0;  
            while(i < len && (str[i]>='0' && str[i]<='9'))  
            {  
                order = order / 10;  
                s = s + (float)(str[i]-'0')*order;  
                i++;  
            }  
          
            if (str[i] == '-')
            s = -1*s;  
          
            return s;  
        }

  • 相关阅读:
    用ps命令查看进程的内存
    女人
    一个中文系高材生的高水平请假条
    常用元件封装
    premiere 视频滤镜详解
    Start of Authority Record (SOA) (转) Anny
    DNS Record Format and Types Anny
    域名解析的配置文件 /etc/resolv.conf Anny
    System Information Record (HINFO)(转) Anny
    Bug分析:为bug预防奠定基础 (转) Anny
  • 原文地址:https://www.cnblogs.com/ownDefine/p/10780784.html
Copyright © 2011-2022 走看看