2015-11-22 2 views
2

Следующая программа не компилировать при кросс-компиляции из 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 или просто я что-то недопонимаю?

+0

Несколько типов могут представлять 32-разрядное целое число без знака. Это всего лишь аспект C++, с которым вам нужно жить. –

+1

_ «Не следует ли« uint32_t »всегда представлять точно такой же тип (целое число без знака 32-битной ширины), независимо от того, в какой системе мы находимся?» _N.B. его даже не нужно существовать на всех системах! Он существует только в системах, где имеется ровно 32 бита. 'uint_least32_t' всегда существует, но может быть больше 32 бит. –

ответ

3

uint32_t должен всегда представлять собой беззнаковое целое число в 32 бита, да.

Но это вполне возможно для sizeof(long unsigned int) == sizeof(unsigned int), чтобы быть правдой. Это два разных типа, которые могут иметь одинаковую ширину.

+0

А, да, конечно. Тогда, я думаю, что это просто проблема QOI в Boost, что 'boost :: uint32_t' не всегда совпадает с' std :: uint32_t', так как это затрудняет взаимодействие между ними. –

+0

Для справки я просмотрел список рассылки [Boost.Devel] (http://thread.gmane.org/gmane.comp.lib.boost.devel/264335) по этой проблеме. –

+0

В отличие от явной специализации, не соответствующей, и искажения, в чем проблема, с которой вы сталкиваетесь? @louisdionne – Yakk

2

Нет гарантии, что два 32-разрядных целочисленных значения без знака являются одинаковыми.

Фактически, long и int могут быть разных типов, и оба могут одновременно быть 32-битными значениями. То же для wchar_t и short - 16 бит.

+0

Спасибо за ваш ответ. Я соглашусь с ответом orlp, потому что он пришел первым, но ваш одинаково хорош. –

Смежные вопросы