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

Posted

技术标签:

【中文标题】针对不同目标的 c++ 强制转换(编译器)【英文标题】:c++ casting for different targets (compilers) 【发布时间】:2019-05-21 10:29:25 【问题描述】:

鉴于以下情况:

code-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(我的链接)上被标记为无用的转换,但是在我的 linux 机器上运行的相同代码不会发出警告 - 但它如果我施放它,会给我一个不同的警告。

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

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

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

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

【问题讨论】:

看来你需要一个旧的好#ifdef 说实话-Wuseless-cast 对我来说似乎没有用。我会删除它。 不要尝试将向量的大小存储在long unsigned int 中,而是使用std::size_t。它将结果存储在适当类型的变量中,并且完全不需要强制转换。 “为了方便起见,这里是代码本身” 不仅仅是方便;问题必须为后代独立 @code_fodder - 您的示例是人为设计的,因为这意味着 API 存在缺陷(如果 API 旨在跨平台,则使用 unsigned long 来保存向量的大小或 @ 的结果987654333@ 是一个缺陷)。无论如何,显而易见的解决方案是更改 API - 如果它不在您的控制范围内,请提交功能/错误请求。如果您不能(或者,作为 API 的所有者,您可能不会)这样做,那么请编写一个函数来进行转换。这将转换隔离到一个地方,您可以使用预处理器帮助为不同的编译器实现该函数的版本。 【参考方案1】:

我正在尝试做的是编写一些没有警告的代码,并且设置了所有强制转换警告(也许这在交叉编译时是最理想的)

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

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

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

我打算只删除 -Wuseless-cast 选项

这是另一种选择。

【讨论】:

这是怎么回答的,这更像是评论。 @nada 你错了。评论是为了要求澄清。如果您认为自己有更好的答案,请随时发布。 @LightnessRacesinOrbit 完成。【参考方案2】:

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

auto size = test_vect.size();

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

【讨论】:

这是相同的选项,只是更加模糊。【参考方案3】:

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

【讨论】:

怀疑这会起作用,因为条件中没有从属名称 这是一个有趣的想法...可能包含在类似演员表的功能中...我想我暂时只删除无用的演员表,谢谢 @LightnessRacesinOrbit 你是对的(这个答案的后半部分是错误的):godbolt.org/z/l9VlIC

以上是关于针对不同目标的 c++ 强制转换(编译器)的主要内容,如果未能解决你的问题,请参考以下文章

强制转换的结果是右值吗?

C++中的数据类型强制转换

C++强制类型转换

c++ 之 类型转换

Java中的强制类型转换是如何转换的?

Java中的强制类型转换是如何转换的?