使用htons时的旧式演员表

时间:2014-07-08 10:44:49

标签: c++

我有一段使用htons的代码,我在编译时遇到了这个错误。

  

错误:使用旧式强制转换[-Werror = old-style-cast]

该行是:

mFarEnd.sin_port = htons( g_DolCommsUdpPort );

其中g_DolCommsUdpPort定义为:

static uint16_t const  g_DolCommsUdpPort = 43775;

我尝试了以下C ++演员但没有成功:

mFarEnd.sin_port = static_cast< unsigned short int >(htons( Bti::Atlas::UDPPorts::g_DolCommsUdpPort ) );

1 个答案:

答案 0 :(得分:3)

我的赌注是htons是一个扩展为具有强制转换和移位的表达式的宏。与内联函数相反,宏的好处在于它以常量表达式工作。 (C ++ 11在常量中启用合适的内联函数。)

C和POSIX库中的所有类似内联函数的宏也需要作为extern函数存在。你可以打败宏并通过括号括起来调用函数:

mFarEnd.sin_port = (htons)( g_DolCommsUdpPort );

它也很诱人#undef htons,但这是非法的(未定义的行为)。例如,实现可以在内部使用宏来生成一个常量,在一些完全不相关的宏中。