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,求他的是非法的,我就闭嘴了。

 

其实我们所做的这一切,为的是有一个好的编码风格,看上去没那么别扭,项目或者平台移植的时候不要出那么多问题就好了而已。

posted on 2015-07-04 15:41  jianglx  阅读(422)  评论(0)    收藏  举报

导航