C/C++利用位运算来进行函数参数检查
2013-10-19 00:28
711 查看
经常我们写一个函数时,假如它有多个参数,我们在函数入口处,对这多个参数的有效性进行检查,经常使用的写法会像下面一样
当然,这样的写法你会在PC上,或是能够进行单步调试的时候,设置断点,能够很清楚的知道哪个参数无效,但是我们再嵌入式开发的时候,在真机上调试,常常只能用printf语句打印来进行调试,遇到这种写法,你只知道参数有误,却不知道是哪个参数出了问题。然后又来加打印,去查看值看哪个参数出了问题。。。。。。
或者,你可以直接写成下面这样的写法:
这样的写法参数一多久显得不是很优雅了,这几天不经意想到了用位运算的方式来表示出错的参数索引,可以用下面的方式:
通过上面的写法可以很容易找到第一个无效的参数,例如我这打印出的flag为2,换算成2进制为0010(由于flag初始化为1,所以看2进制结果时应该从次低位开始),所以这很容易看出是第一个参数出了问题,然后开始调试。
#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++将数组名作为函数参数对数组元素进行相应的运算
- (转载)你好,C++(26)如何与函数内部进行数据交换?5.1.3 函数参数的传递
- C++利用不完全实例化来获得函数模板参数的返回值和参数
- C++ 通过main()函数输入参数,实现简单的四则运算
- C++学习 【4.1】 利用函数实现指定的功能---函数,函数的形式,函数参数
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- 利用CCCC和CppCheck对C++代码进行检查并和Hudson集成
- Java中利用位与和位或进行函数参数优化的技巧
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- C++利用不完全实例化来获得函数模板参数的返回值和参数
- c++中如何通过函数参数对指针进行赋值
- C++利用访函数进行选择排序
- c++将引用或者是指针作为函数参数实现实参的运算
- C++学习 【4.1】 利用函数实现指定的功能---函数,函数的形式,函数参数
- C++利用二级指针做函数形参来进行修改实参的实例分析
- C++:vector利用swap()函数进行内存释放源码
- c++小技巧(二)函数参数可以利用中间变量转换
- 利用数组名作为函数参数传递排序和用指针进行排序