注意参数的型别和函数参数的匹配

本文分析了一个关于ACE库中send_n函数调用产生的编译警告问题。问题源于函数重载导致的参数类型匹配错误,通过明确指定NULL类型的解决方案避免了此问题,并总结了相关教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1               注意参数的型别和函数参数的匹配

检查COMMLIB部分,发现GCS部分一个告警。

pet_gcs_interface.cpp:212: warning: passing NULL to non-pointer argument 3 of 'ssize_t ACE_SOCK_Stream::send_n(const void*, size_t, int, const ACE_Time_Value*, size_t*) const'

检查代码。报告告警的地方在。

petappframe->FrameHeadEncode();

ret = client_stream.send_n((void *)petappframe,len,NULL);

跳过去检查了一下send_n函数的重载函数,发现了问题。ACEsend_n有两个重载函数,

  /// Try to send exactly @a len bytes from @a buf to the connection socket.

  ssize_t send_n (const void *buf,

                  size_t len,

                  int flags,

                  const ACE_Time_Value *timeout = 0,

                  size_t *bytes_transferred = 0) const;

 

  /// Try to send exactly @a len bytes from @a buf to the connected socket.

  ssize_t send_n (const void *buf,

                  size_t len,

                  const ACE_Time_Value *timeout = 0,

                  size_t *bytes_transferred = 0) const;

对于ret = client_stream.send_n((void *)petappframe,len,NULL); 这个调用,上面两个函数都可以匹配,所以对编译器要么无法正确编译,要么要选择一个。(其实无法编译应该更好)。原来的开放者希望匹配的函数应该是ssize_t send_n (const void *buf,size_t len, const ACE_Time_Value *timeout = 0,size_t *bytes_transferred = 0) const。但是由于使用了NULL,这个可爱的参数,(#define NULL    0),第3个参数被当作了int参数。实际匹配的函数成了ssize_t send_n (const void *buf,size_t len,int flags, const ACE_Time_Value *timeout = 0,size_t *bytes_transferred = 0) const;

这个代码应该改为。明确这个指针的类型,避免编译错误。

ACE_Time_Value *time_wait = NULL;

ret = client_stream.send_n((void *)petappframe,len,time_wait);

Effect C++里面应该有一节讲过这个问题。

 

问题教训和总结:

注意参数的型别和函数参数的匹配,

对于重载函数的参数要精心设计,避免出现这样参数,ACE这两个函数的设计就会导致这个问题,所以它的参数设计其实是失败。

对于NULL是什么要有清楚认识,NULLC++中往往就是被定义为0,而不是((void *)0),所以格外要当心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值