使用std :: strtoul将std :: string转换为unsigned short的警告。有更好的选择吗?

时间:2017-01-03 12:28:44

标签: c++ gcc clang c++14

我在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我在做什么错了?有没有更好的方法来做到这一点,没有任何风险或警告?

同时查看投射方法列表herestd::stringunsigned short似乎没有投射选项。

3 个答案:

答案 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_castconst_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
}