在文件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。