不同目标(编译器)的c ++强制转换

时间:2019-05-21 10:29:26

标签: c++ casting cross-compiling

给出以下内容:

code-link

为方便起见,以下是代码本身(我不确定我的链接是否正常工作):

#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 longsize_t可以不同。但是我想做的是编写一些没有设置所有强制转换警告的警告的代码(也许在交叉编译时是不熟悉的。)

因此,一个编译器抱怨我正在转换类型,所以我进行了强制转换,但是另一编译器则抱怨无用的强制转换-所以我删除了强制转换-然后我们开始:(

是否有一种好的方法,这样我就不会在两个编译器上收到警告?

我本来只是删除-Wuseless-cast选项,但我想我可以看看是否有人有其他想法...

3 个答案:

答案 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 = ...;