Следующая программа не компилировать при кросс-компиляции из OS X для ARM:повышение :: uint32_t = станд :: uint32_t для целевого 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 или просто я что-то недопонимаю?
Несколько типов могут представлять 32-разрядное целое число без знака. Это всего лишь аспект C++, с которым вам нужно жить. –
_ «Не следует ли« uint32_t »всегда представлять точно такой же тип (целое число без знака 32-битной ширины), независимо от того, в какой системе мы находимся?» _N.B. его даже не нужно существовать на всех системах! Он существует только в системах, где имеется ровно 32 бита. 'uint_least32_t' всегда существует, но может быть больше 32 бит. –