当前位置:编程学习 > C/C++ >>

C/C++利用位运算来进行函数参数检查

 经常我们写一个函数时,假如它有多个参数,我们在函数入口处,对这多个参数的有效性进行检查,经常使用的写易做图像下面一样
 
#include "stdafx.h"  
#include <iostream>  
  
void testFunction(int *pTest, int test, bool isTest){  
    if((pTest == NULL) || (test < 0) || (isTest == false)){  
    printf("invalid argument\n");  
    return;  
    }  
  
    return;  
}  
  
int _tmain(int argc, _TCHAR* argv[]){  
    testFunction(NULL, 10, true);  
  
    return 0;  
}  

 

 
    当然,这样的写法你会在PC上,或是能够进行单步调试的时候,设置断点,能够很清楚的知道哪个参数无效,但是我们再嵌入式开发的时候,在真机上调试,常常只能用printf语句打印来进行调试,遇到这种写法,你只知道参数有误,却不知道是哪个参数出了问题。然后又来加打印,去查看值看哪个参数出了问题。。。。。。
    或者,你可以直接写成下面这样的写法:
 
void testFunction(int *pTest, int test, bool isTest){  
    if(pTest == NULL){  
        printf("invalid argument of pTest\n");  
        return;  
    }  
      
      
    if(test < 0){  
        printf("invalid argument of test\n");  
        return;  
    }  
      
    if(isTest == false){  
        printf("invalid argument of isTest\n");  
        return;  
    }  
  
    return;  
}  

 

 
    这样的写法参数一多久显得不是很优雅了,这几天不经意想到了用位运算的方式来表示出错的参数索引,可以用下面的方式:
 
#include "stdafx.h"  
#include <iostream>  
  
  
#define ARGCHECK(CONDITION, FLAG)    ((FLAG <<= 1) && (CONDITION))  
  
  
void testFunction(int *pTest, int test, bool isTest){  
    int flag = 1;  
  
  
    if(ARGCHECK(pTest == NULL, flag)   
        || ARGCHECK(test < 0, flag)   
        || ARGCHECK(isTest == false, flag)){  
        printf("Invalid argument is %0x\n", flag);  
        return;  
    }  
  
    return;  
}  
  
  
int _tmain(int argc, _TCHAR* argv[]){  
    testFunction(NULL, -10, true);  
  
    return 0;  
}  

 

    通过上面的写法可以很容易找到第一个无效的参数,例如我这打印出的flag为2,换算成2进制为0010(由于flag初始化为1,所以看2进制结果时应该从次低位开始),所以这很容易看出是第一个参数出了问题,然后开始调试。
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,