繁体   English   中英

针对不同目标的c ++转换(编译器)

[英]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是一个选项,它应该有一个合适的宏来让编译器开心,如果你不知道如何使用它 - 使你的变量autodecltype(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM