【发布时间】:2019-05-21 10:29:25
【问题描述】:
鉴于以下情况:
为了方便起见,这里是代码本身(我不确定我的链接是否有效):
#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 和size_t 这两个可能不同。但是我想要做的是编写一些没有警告的代码,所有的强制转换警告都设置了(也许这在交叉编译时是最理想的)。
所以,一个编译器抱怨我正在转换类型,所以我进行了转换,但是另一个编译器抱怨无用的转换 - 所以我删除了转换 - 然后我们开始了:(
有没有一种好的方法可以让我在任何一个编译器上都不会收到警告?
我打算删除 -Wuseless-cast 选项,但我想我会看看是否有人有其他想法......
【问题讨论】:
-
看来你需要一个旧的好#ifdef
-
说实话
-Wuseless-cast对我来说似乎没有用。我会删除它。 -
不要尝试将向量的大小存储在
long unsigned int中,而是使用std::size_t。它将结果存储在适当类型的变量中,并且完全不需要强制转换。 -
“为了方便起见,这里是代码本身” 不仅仅是方便;问题必须为后代独立
-
@code_fodder - 您的示例是人为设计的,因为这意味着 API 存在缺陷(如果 API 旨在跨平台,则使用
unsigned long来保存向量的大小或 @ 的结果987654333@ 是一个缺陷)。无论如何,显而易见的解决方案是更改 API - 如果它不在您的控制范围内,请提交功能/错误请求。如果您不能(或者,作为 API 的所有者,您可能不会)这样做,那么请编写一个函数来进行转换。这将转换隔离到一个地方,您可以使用预处理器帮助为不同的编译器实现该函数的版本。
标签: c++ casting cross-compiling