C++针对不同目标(编译器)的类型转换

4

以下是给定的内容:

代码链接

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

#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选项,但我想看看是否有其他想法...

似乎你需要一个老好的#ifdef。 - P. PICARD
3
说实话,对我来说,“-Wuseless-cast”似乎没有用处。我会把它移除。 - HolyBlackCat
2
不要尝试将向量的大小存储在“long unsigned int”中,而是使用“std::size_t”。这将把结果存储在适当类型的变量中,并消除了任何需要转换的需求。 - Peter
1
这里是代码本身,方便起见。不仅如此,问题必须自给自足以供后人参考。 - Lightness Races in Orbit
1
@code_fodder - 你的例子是人为制造的,因为这意味着一个有缺陷的API(如果API旨在跨平台使用,则使用“unsigned long”来保存向量的大小或“sizeof”的结果是有缺陷的)。无论如何,显而易见的解决方案是更改API - 如果不在您的控制范围内,请提交功能/错误请求。如果您不能(或者作为API所有者,您任意地不会)这样做,那么编写一个函数来执行转换。这将把转换隔离到一个地方,并且您可以使用预处理器来帮助实现不同编译器版本的该函数。 - Peter
显示剩余17条评论
3个回答

6
我试图编写一些代码,使所有强制转换警告都消失(也许在交叉编译时这很乐观)。
如果你有强制转换,那么在交叉编译时这是很乐观的。
有什么好方法可以做到在两个编译器上都不出现警告?
不要使用强制转换。将变量声明为std::size_t类型即可。
我本来想删除-Wuseless-cast选项的。
那就是另一个选择。

这怎么算是答案呢?这更像是一条评论。 - nada
1
@nada 你错了,评论是用来请求澄清的。如果你认为你有更好的答案,可以自由地发表它。 - Lightness Races in Orbit
@LightnessRacesinOrbit 完成。 - nada

2

正如Lightness Races in Orbit所指出的那样,size_t是一种选择,如果你不想使用它,应该有一个适当的宏可以让编译器满意。另一种选择是将您的变量设置为autodecltype(test_vect.size()):

最初的回答

auto size = test_vect.size();

最初的回答
或者
decltype(test_vect.size()) size = test_vect.size();

这是相同的选项,只是更加模糊了。 - Lightness Races in Orbit

1

有一个值得考虑的观点是:为什么你的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 = ...;

条件中没有依赖名称,我怀疑这不会起作用。 - Lightness Races in Orbit
这是一个有趣的想法...也许可以包装在类似于转换函数的东西中...我认为我现在只是决定暂时删除无用的转换,谢谢。 - code_fodder
1
@LightnessRacesinOrbit 您是正确的(并且此答案的后半部分是错误的):https://godbolt.org/z/l9VlIC - Max Langhof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接