不同目标的 C++ 转换(编译器)
c++ casting for different targets (compilers)
鉴于以下情况:
为方便起见,这里是代码本身(我不确定我的 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(我的 link)上被标记为无用的转换,但是相同的代码 运行 在我的 linux 框中没有给出警告 - 但如果我 不 施放它,它会给我一个不同的警告。
我知道 unsigned long
和 size_t
这两个可能不同。但我想做的是编写一些没有警告的代码,并设置了所有强制转换警告(也许这在交叉编译时是 optamisitic)。
所以,一个编译器抱怨我正在转换类型,所以我进行了强制转换,但随后另一个编译器抱怨无用的强制转换 - 所以我删除了强制转换 - 然后我们继续:(
是否有解决此问题的好方法,这样我就不会在任何一个编译器上收到警告?
我打算只删除 -Wuseless-cast
选项,但我想我会看看是否有人有其他想法...
我想到的一个论点是:为什么你的大小变量需要 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 = ...;
what I am trying to do is write some code that has no warnings with all the casting warnings set (maybe this is optamisitic when cross compiling)
如果有强制转换,交叉编译时乐观。
Is there a good approach to this so that I dont get warnings on either compilers?
没有演员表。使您的变量类型为 std::size_t
.
I was going to just remove the -Wuseless-cast
option
这是另一个选项。
正如 Lightness Races in Orbit 指出的那样,size_t
是一个选项,它应该有一个适当的宏来让编译器满意,如果你不知何故不想使用它 - 让你的变量 auto
或 decltype(test_vect.size())
是另一种选择:
auto size = test_vect.size();
或
decltype(test_vect.size()) size = test_vect.size();
鉴于以下情况:
为方便起见,这里是代码本身(我不确定我的 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(我的 link)上被标记为无用的转换,但是相同的代码 运行 在我的 linux 框中没有给出警告 - 但如果我 不 施放它,它会给我一个不同的警告。
我知道 unsigned long
和 size_t
这两个可能不同。但我想做的是编写一些没有警告的代码,并设置了所有强制转换警告(也许这在交叉编译时是 optamisitic)。
所以,一个编译器抱怨我正在转换类型,所以我进行了强制转换,但随后另一个编译器抱怨无用的强制转换 - 所以我删除了强制转换 - 然后我们继续:(
是否有解决此问题的好方法,这样我就不会在任何一个编译器上收到警告?
我打算只删除 -Wuseless-cast
选项,但我想我会看看是否有人有其他想法...
我想到的一个论点是:为什么你的大小变量需要 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 = ...;
what I am trying to do is write some code that has no warnings with all the casting warnings set (maybe this is optamisitic when cross compiling)
如果有强制转换,交叉编译时乐观。
Is there a good approach to this so that I dont get warnings on either compilers?
没有演员表。使您的变量类型为 std::size_t
.
I was going to just remove the
-Wuseless-cast
option
这是另一个选项。
正如 Lightness Races in Orbit 指出的那样,size_t
是一个选项,它应该有一个适当的宏来让编译器满意,如果你不知何故不想使用它 - 让你的变量 auto
或 decltype(test_vect.size())
是另一种选择:
auto size = test_vect.size();
或
decltype(test_vect.size()) size = test_vect.size();