在文件wmData.h和tlSystem.h文件中,都有BOOL数据类型的定义,定义为int类型。并且定义了TRUE为1,FALSE为0。
typedef int BOOL; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif
在ospf协议代码中,对BOOL类型使用自定义的枚举类型BOOLEAN,在ospfCommonUtils.h文件中。
#if !defined BOOLEAN typedef enum BOOLEAN { _FALSE = 0 /* FALSE and TRUE are already defined here */ ,_TRUE = 1 } BOOLEAN; #endif
对于某些ospf协议层的函数,如果输入参数中有BOOLEAN类型,在调用时就需要注意类型转化。
/* ospf协议层函数定义 */ void ospf_no_asbr_routing_aggregate(OSPF_CLASS *ospf, ULONG network, ULONG mask, ULONG restore_tag, BOOLEAN restore_notAdvertise, BOOLEAN restore_nssaOnly) { if(restore_notAdvertise) { //TO DO } } typedef enum OSPF_IMPORT_PARA_MASK { OSPF_IMPORT_PARA_MASK_COST = (1<<0), OSPF_IMPORT_PARA_MASK_TYPE = (1<<1), OSPF_IMPORT_PARA_MASK_TAG= (1<<2), OSPF_IMPORT_PARA_MASK_NSSAONLY = (1<<3), OSPF_IMPORT_PARA_MASK_ALWAYS = (1<<4), OSPF_IMPORT_PARA_MASK_NOTADV = (1<<5) }OSPF_IMPORT_PARA_TYPE; /* sw层函数调用上面的函数 */ STATUS swOspfAsbrAggregateDestroy(ULONG pID,ULONG ipNum,ULONG maskNum,UINT32 paraMask) { ospf_no_asbr_routing_aggregate(ospf,ipNum,maskNum, (paraMask & OSPF_IMPORT_PARA_MASK_TAG)? TRUE : FALSE, (paraMask & OSPF_IMPORT_PARA_MASK_NOTADV)? TRUE : FALSE, (paraMask & OSPF_IMPORT_PARA_MASK_NSSAONLY)? TRUE : FALSE); }
原来犯得错误是,在sw层调用时,写成如此:
/* sw层函数调用上面的函数 */ STATUS swOspfAsbrAggregateDestroy(ULONG pID,ULONG ipNum,ULONG maskNum,UINT32 paraMask) { ospf_no_asbr_routing_aggregate(ospf,ipNum,maskNum, paraMask & OSPF_IMPORT_PARA_MASK_TAG, paraMask & OSPF_IMPORT_PARA_MASK_NOTADV, paraMask & OSPF_IMPORT_PARA_MASK_NSSAONLY); }
按照上面的代码,将导致传入的参数不对。例如,如果paraMask为0x0000,0008,那么这个参数将不能够被识别为BOOLEAN中定义的TRUE。
如果函数ospf_no_asbr_routing_aggregate()中的参数使用BOOL类型,则可以这么传入参数。因为如果把BOOL定义为int类型,则任何不为0的整数都可以被解释为TRUE,即判断if(a)是为TRUE。