C++ boost::uint32\u t!=标准::用于ARM目标的uint32_t
从OS X交叉编译到ARM时,以下程序无法编译:C++ boost::uint32\u t!=标准::用于ARM目标的uint32_t,c++,boost,arm,C++,Boost,Arm,从OS X交叉编译到ARM时,以下程序无法编译: #include <boost/cstdint.hpp> #include <cstdint> #include <type_traits> static_assert(std::is_same<std::uint32_t, boost::uint32_t>::value, ""); int main() { } 在哪里 为了尝试进一步诊断问题,我尝试了以下技巧: template <t
#include <boost/cstdint.hpp>
#include <cstdint>
#include <type_traits>
static_assert(std::is_same<std::uint32_t, boost::uint32_t>::value, "");
int main() { }
在哪里
为了尝试进一步诊断问题,我尝试了以下技巧:
template <typename T> struct show;
using A = show<std::uint32_t>::invalid;
using B = show<boost::uint32_t>::invalid;
我觉得这种情况非常令人惊讶。
uint32\u t
是否应该始终表示完全相同的类型(32位无符号整数),而不管我们在哪个系统上?这是Boost中的一个bug还是我误解了什么?uint32\u t
应该始终表示一个32位宽度的无符号整数,是的
但是
sizeof(long unsigned int)==sizeof(unsigned int)
完全有可能为真。这两种类型可以具有相同的宽度。不能保证两个32位无符号整数值是相同的类型
事实上,
long
和int
可以是不同的类型,它们可以同时是32位值。对于16位值的wchar\u t
和short
也是如此。多种类型可以表示32位无符号整数。这只是C++中的一个方面。“不应该<代码> UTIT32×T < /COD>总是代表完全相同的类型(32位宽度无符号整数),而不管我们在哪个系统上使用“N.B.它甚至不需要存在于所有系统上!它只存在于一种类型正好为32位的系统上uint\u至少32\u t
始终存在,但可能大于32位。啊,是的,当然。然后,我认为这只是Boost中的一个QOI问题,Boost::uint32\u t
并不总是与std::uint32\u t
相同,因为这使得两者之间的互操作更加困难。作为参考,我跟踪了邮件列表中关于这个问题的内容。除了明确的专业化不匹配和混乱之外,你面临的问题是什么@louisdionne@Yakk从某个函数指针void(*)(boost::uint32\u t)
到void(*)(std::uint32\u t)
的转换无效。谢谢您的回答。我会接受奥尔普的答案,因为它排在第一位,但你的答案同样好。
> arm-none-eabi-g++ --version
arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release)
[ARM/embedded-4_9-branch revision 224288]
template <typename T> struct show;
using A = show<std::uint32_t>::invalid;
using B = show<boost::uint32_t>::invalid;
main.cpp:8:32: error: 'invalid' in 'struct show<long unsigned int>' does not name a type
using A = show<std::uint32_t>::invalid;
^
main.cpp:9:34: error: 'invalid' in 'struct show<unsigned int>' does not name a type
using B = show<boost::uint32_t>::invalid;