对于ARM目标,boost :: uint32_t!= std :: uint32_t

时间:2015-11-22 17:05:33

标签: 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() { }

我正在建设

arm-none-eabi-g++ -I /path/to/boost -std=c++11 -c main.cpp

,其中

> 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;

编译器给出了以下错误消息,表明std::uint32_t == long unsigned int,而boost::uint32_t == unsigned int

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;    

我觉得这种情况非常令人惊讶。不管我们在哪个系统,uint32_t是否总是代表完全相同的类型(32位宽度无符号整数)?这是Boost中的一个错误还是我误解了什么?

2 个答案:

答案 0 :(得分:3)

uint32_t应始终表示32位宽度的无符号整数,是的。

sizeof(long unsigned int) == sizeof(unsigned int)完全可能是真的。这是两种不同的类型,可以有相同的宽度。

答案 1 :(得分:2)

无法保证两个32位无符号整数值的类型相同。

实际上,longint可以是不同的类型,并且两者都可以是32位值,同时。同上,wchar_tshort为16位值。