C语言的BOOL相关问题
C语言的BOOL相关问题
1 BOOL的自定义
C语言中没有像C++ bool这样的类型(貌似C99的新特性里面有_Bool,我没用过,不知咋样),如果想表达bool这样的数据,我们常常自定义bool类型。既然是自定义,那肯定是五花八门的,不信来看:
typedef int BOOL; typedef UINT BOOL; typedef unsigned char BOOL; typedef enum { FALSE, TRUE }BOOL; #define BOOL int #define BOOL unsigned int …
这本身是没什么问题的,只要同一个工程统一用一种定义就好了。
不过,在现在分工越来越细的时代,全部代码是你一个人写的,那是不可能的,那问题来了,如果同一个工程用了多以一种的BOOL定义,会是什么情况呢?
2 一个工程用了多个BOOL定义
2.1 编译是否会提示错误
也许你会说,这编译都不通过啦。
1 typedef int BOOL; 2 typedef unsigned char BOOL;
这真的有可能编译不通过,至少我测试过VS2005会提示编译错误,但是
1 typedef unsigned char BOOL; 2 #define BOOL int
你觉得这个会提示编译错误吗?NO!甚至连warning都没有!(用VS2005测试没有)
2.2 同一个工程使用不同的BOOL的问题
现在我们来看看同一个工程使用不一样的BOOL会有什么问题。
你的工程用了一个某人给你提供的lib文件,假设他的lib是这样的:
1 typedef UINT BOOL; 2 BOOL Device_IsAvailable(void) 3 4 typedef struct 5 { 6 BOOL vAvailable; 7 char strName[16]; 8 }tDeviceInfo_t; 9 10 void Device_DoSomething(tDeviceInfo_t* pInfo);
而你的Application.c文件是这样的
1 typedef unsigned char BOOL;
① 调用第一个函数应该没啥运行问题的,顶多有warning或者没有
1 BOOL bAvailable; 2 3 bAvailable = (BOOL)Device_IsAvailable();
添加BOOL 强制转换,应该没问题。
② 而在调用第二个函数的时候,这就难说了
在Application.c里面的sizeof(tDeviceInfo_t)和在他的lib里面的sizeof(tDeviceInfo_t)是不一样的。
那在Device_DoSomething里面发生什么事就不知道了。
2.3 将BOOL定义成统一?
OK,你会把BOOL定义成和lib的一样(UINT),但是你有很多来自不同地方的lib啊!
并且,我们很多人写的代码,写的都不怎么规范:
1 U8* v_display_slider(void) 2 { 3 slider.display = TRUE; 4 return &slider.display; 5 }
(类似这样的函数多了去了……)
这个函数呢,本身原意是一个BOOL类型的函数,可是非要用U8*来做其返回值。
万一,某c文件有一个
1 typedef UINT BOOL;
对v_display_slider函数的调用
1 BOOL* pSliderOn = v_display_slider();
这和以下表达有什么区别?
1 UINT* pSliderOn = v_display_slider();
这个问题是很严重的,本身取1byte的内容,而变成取的是可能4bytes的内容!
2.4 将BOOL换个名字?
那你此时此刻会不会埋怨BOOL类型太好用了,换一个?
BOOL8,这个名字好吧?一目了然,直截了当。(是不是很聪明呢)
1 typedef unsigned char BOOL8;
很不幸,我开发中的某项目代码:
Pseudo.h文件里
1 #ifndef BOOL8 2 #define BOOL8 e_bool_t 3 #endif
另外,e_bool_t神奇地出现在e_types.h
1 typedef uint32_t e_bool_t;
(有一种想哭的感觉……)
再换一个?
1 typedef unsigned char BOOL8_I_AM_CRYING;
这个肯定没人用过,不过,需要到这种地步了么?
3 BOOL变量或者函数的比较
我见过很多代码里面,喜欢这样用
1 if(IsBoolXxx() == TRUE) // TRUE 当然是1
为啥不写成
1 if(IsBoolXxx()) 2 { 3 // do xxx 4 }
这样呢?除了1是TRUE,2、3、4、-1也是TRUE啊。
当然,如果规范里面定义TRUE只能等于1,求他的是非法的,我就闭嘴了。
其实我们所做的这一切,为的是有一个好的编码风格,看上去没那么别扭,项目或者平台移植的时候不要出那么多问题就好了而已。
浙公网安备 33010602011771号