我在C++ 14
上使用clang
& gcc
。我有std::string
我需要转换为unsigned short
我是按照以下方式进行的。
unsigned short u_var = 1234; //some default value
std::string str = "5678"; //some default value
u_var = (unsigned short) std::strtoul(str.c_str(), NULL, 0);
我是从here找到的。
但是,我收到以下警告
Semantic issue
warning: use of old-style cast
clang
& gcc
。 我在做什么错了?有没有更好的方法来做到这一点,没有任何风险或警告?
同时查看投射方法列表here,std::string
到unsigned short
似乎没有投射选项。
答案 0 :(得分:3)
问题在于C风格演员(他们有点冒险)。请改用static_cast
。像:
u_var = static_cast< unsigned short >( std::strtoul(str.c_str(), NULL, 0) );
我也会使用std::stoul
代替std::strtoul
,如果可能的话(它是C ++ 11)
答案 1 :(得分:2)
(unsigned short) <expression>
是C-style explicit cast,在尝试执行各种转化时可能不安全,包括reinterpret_cast
和const_cast
。
您应该使用static_cast
进行数字转换:
u_var = static_cast<unsigned short>(std::strtoul(str.c_str(), NULL, 0));
答案 2 :(得分:1)
铿锵声和警告出现警告GCC。我在做什么有什么问题?在没有任何风险或警告的情况下,有更好的方法吗?
编译器为您提供了一个建议,即使用c ++样式转换的安全性:static_cast<unsigned short>(...)
而不是c样式转换:(unsigned short)...
如果您正在使用C ++ 14,那么您可以考虑使用std::stoul
函数,如果出现错误,它会抛出异常,这更容易使用。
另外,在这里查看一下转换方法的列表,似乎没有可用于std :: string到无符号short的转换选项。
没有用于将std :: string转换为unsinged short的标准强制转换,但使用boost :: lexical_cast可能:您的代码如下所示:
try
{
u_var = boost::lexical_cast<unsigned short>(str);
}
catch(const boost::bad_lexical_cast &)
{
// error
}