给出以下内容:
为方便起见,以下是代码本身(我不确定我的链接是否正常工作):
#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
与size_t
可以不同。但是我想做的是编写一些没有设置所有强制转换警告的警告的代码(也许在交叉编译时是不熟悉的。)
因此,一个编译器抱怨我正在转换类型,所以我进行了强制转换,但是另一编译器则抱怨无用的强制转换-所以我删除了强制转换-然后我们开始:(
是否有一种好的方法,这样我就不会在两个编译器上收到警告?
我本来只是删除-Wuseless-cast
选项,但我想我可以看看是否有人有其他想法...
答案 0 :(得分:6)
我要做的是编写一些没有警告的代码,并设置所有强制转换警告(也许在交叉编译时这是不合理的)
如果有强制转换,则在交叉编译时会感到乐观。
是否有一种好的方法,这样我就不会在两个编译器上收到警告?
没有演员表。使变量的类型为std::size_t
。
我本来只是删除
-Wuseless-cast
选项
那是另一种选择。
答案 1 :(得分:2)
正如Lightness Races in Orbit所指出的那样,size_t
是一个选项,如果您不希望使用它,则应该有一个合适的宏以使编译器感到满意-使变量{{1} }或auto
是另一种选择:
decltype(test_vect.size())
或
auto size = test_vect.size();
答案 2 :(得分:1)
想到的一个论点是:为什么您的大小变量根本不需要是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 = ...;