![](/img/trans.png)
[英]How do C/C++ compilers handle type casting between types with different value ranges?
[英]c++ casting for different targets (compilers)
鉴于以下内容:
为方便起见,这是代码本身(我不确定我的链接是否正常):
#include <iostream>
#include <vector>
#include <stdint.h>
using namespace std;
int main()
{
cout<<"Hello World";
std::vector<std::string> test_vect {"1", "2"};
long unsigned int size = static_cast<long unsigned int>(test_vect.size());
std::cout << "size: " << size << std::endl;
return 0;
}
以下编译选项: g++ file.c -Wall -Wextra "-Werror" "-Wuseless-cast"
你可以在这里看到我正在将vector.size()
为long unsigned int
,这会被标记为Wandbox(我的链接)上无用的强制转换但是在我的linux盒子上运行的相同代码不会发出警告 - 但它会如果我不施展,请给我一个不同的警告。
据我所知,两个unsigned long
vs size_t
可能不同。 但我要做的是编写一些没有警告的代码,并设置所有的转换警告(当交叉编译时,这可能是optamisitic)。
所以,一个编译器抱怨我正在转换类型,所以我施放,但然后另一个编译器抱怨无用的演员 - 所以我删除演员 - 我们周围去:(
有没有一个很好的方法,以便我不会在任何编译器上收到警告?
我打算删除-Wuseless-cast
选项,但我想我会看看是否还有其他想法......
我想要做的是编写一些没有警告的代码,并设置所有的投射警告(当交叉编译时,这可能是optamisitic)
如果你有演员阵容,那么在交叉编译时会很乐观。
有没有一个很好的方法,以便我不会在任何编译器上收到警告?
没有演员阵容。 使变量的类型为std::size_t
。
我打算删除
-Wuseless-cast
选项
这是另一种选择。
正如Orbit中的Lightness Races指出的那样, size_t
是一个选项,它应该有一个合适的宏来让编译器开心,如果你不知道如何使用它 - 使你的变量auto
或decltype(test_vect.size())
将是另外一个选项:
auto size = test_vect.size();
要么
decltype(test_vect.size()) size = test_vect.size();
我想到的一个论点是:为什么你的size变量需要long unsigned
而不是std::size_t
?
万一有令人信服的理由,那么(C ++ 17):
long unsigned size;
if constexpr(sizeof(long unsigned)!=sizeof(std::size_t))
size = static_cast<long unsigned>(...);
else
size = ...;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.