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

C++ c++;针对不同目标的强制转换(编译器),c++,casting,cross-compiling,C++,Casting,Cross Compiling,鉴于以下情况: 为了方便起见,下面是代码本身(我不确定我的链接是否有效): #包括 #包括 #包括 使用名称空间std; int main() { 我想到的一个论点是:为什么你的大小变量需要是长无符号的而不是std::size\u t 如果有令人信服的理由,那么(C++17)如何: 长无符号大小; 如果constexpr(sizeof(长无符号)!=sizeof(std::size\u t)) 尺寸=静态铸件(…); 其他的 大小=。。。; 我想做的是编写一些代码,在所有的强制转换警告集中没

鉴于以下情况:

为了方便起见,下面是代码本身(我不确定我的链接是否有效):

#包括
#包括
#包括
使用名称空间std;
int main()
{

我想到的一个论点是:为什么你的大小变量需要是长无符号的而不是std::size\u t

如果有令人信服的理由,那么(C++17)如何:

长无符号大小;
如果constexpr(sizeof(长无符号)!=sizeof(std::size\u t))
尺寸=静态铸件(…);
其他的
大小=。。。;
我想做的是编写一些代码,在所有的强制转换警告集中没有警告(在交叉编译时,这可能是optamistic)

如果您有强制转换,交叉编译时是乐观的

有没有一种好的方法可以让我在两个编译器上都不会收到警告

没有强制转换。请将变量的类型设置为
std::size\t

我正要删除
-Wuseless cast
选项

这是另一个选项。

正如前面指出的,
size\u t
是一个选项,它应该有一个合适的宏来让编译器满意,如果您不想使用它的话-使变量
自动
decltype(test\u vect.size())
将是另一个选项:

auto size=test_vect.size();

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

似乎您需要一个旧的好的#如果说实话
-Wuseless cast对我来说似乎没有什么用处。我会删除它。与其尝试将向量的大小存储在
长无符号int
中,不如使用
std::size\u t
。它将结果存储在适当类型的变量中,并且不需要强制转换“代码本身就是为了方便”不仅仅是为了方便;问题必须是独立的posterity@code_fodder-您的示例是人为的,因为这意味着有缺陷的API(如果API是跨平台的,则使用
无符号long
来保存向量的大小,或者
sizeof
的结果是有缺陷的)。在任何情况下,显而易见的解决方案是更改API-如果它不在您的控制范围内,请提交一个功能/错误请求。如果您不能(或者,作为API的所有者,您任意不会)这样做,然后编写一个函数来进行转换。这将转换隔离到一个位置,您可以使用预处理器来帮助为不同的编译器实现该函数的版本。我怀疑这会起作用,因为条件中没有依赖名称这是一个有趣的想法…可能包装在一个类似cast的函数中…我想我是这样的目前只需移除无用的石膏,thanks@LightnessRacesinOrbit你是对的(这个答案的后半部分是错的):这是一个怎样的答案,这更像是一个评论。@娜达,你错了。评论是为了要求澄清。如果你认为你有更好的答案,请随意发布。@LightnessRacesinOrbit完成了。这是相同的选项,只是更模糊而已。
#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;
}
long unsigned size;
if constexpr(sizeof(long unsigned)!=sizeof(std::size_t))
    size = static_cast<long unsigned>(...);
else
    size = ...;