不同目标的 C++ 转换(编译器)

c++ casting for different targets (compilers)

鉴于以下情况:

code-link

为方便起见,这里是代码本身(我不确定我的 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(我的 link)上被标记为无用的转换,但是相同的代码 运行 在我的 linux 框中没有给出警告 - 但如果我 施放它,它会给我一个不同的警告。

我知道 unsigned longsize_t 这两个可能不同。但我想做的是编写一些没有警告的代码,并设置了所有强制转换警告(也许这在交叉编译时是 optamisitic)。

所以,一个编译器抱怨我正在转换类型,所以我进行了强制转换,但随后另一个编译器抱怨无用的强制转换 - 所以我删除了强制转换 - 然后我们继续:(

是否有解决此问题的好方法,这样我就不会在任何一个编译器上收到警告?

我打算只删除 -Wuseless-cast 选项,但我想我会看看是否有人有其他想法...

我想到的一个论点是:为什么你的大小变量需要 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 = ...;

what I am trying to do is write some code that has no warnings with all the casting warnings set (maybe this is optamisitic when cross compiling)

如果有强制转换,交叉编译时乐观。

Is there a good approach to this so that I dont get warnings on either compilers?

没有演员表。使您的变量类型为 std::size_t.

I was going to just remove the -Wuseless-cast option

这是另一个选项。

正如 Lightness Races in Orbit 指出的那样,size_t 是一个选项,它应该有一个适当的宏来让编译器满意,如果你不知何故不想使用它 - 让你的变量 autodecltype(test_vect.size()) 是另一种选择:

auto size = test_vect.size();

decltype(test_vect.size()) size = test_vect.size();