Как вы справляетесь с изменением размера целых чисел между платформами? - PullRequest
4 голосов
/ 31 августа 2011

Боюсь, я уже знаю ответ на этот вопрос, но я хотел бы быть уверен ...

У меня довольно большой проект с файлом заголовка, который typedefs native native:

typedef unsigned long int    u32;
typedef signed long int      s32;
// etc...

Произошло неизбежное, и сейчас я пытаюсь скомпилировать в системе, где long - это 64-битная версия вместо 32-й. Как лучше всего исправить это?

Я мог бы typedef выше с int (или int32_t / uint32_t из stdint.h), который бы удовлетворял 32-битному размеру на платформах, о которых я знаю, но это все еще кажется сомнительным.Существует также проблема с функциями стиля printf, где использовался %ld (компилятор жалуется и хотел бы вместо этого видеть %d).Все они должны быть изменены, не так ли (возможно, с определениями в inttypes.h)?

Это кажется простым, но я хотел бы быть уверен, прежде чем начать копаться в нем (исправляя формат printf)струны кажутся пугающими). ​​

Ответы [ 3 ]

6 голосов
/ 31 августа 2011

C имеет <stdint.h>, что в C ++ 0x равно <cstdint>.Для не-C ++ 0x компиляторов у вас есть <boost/cstdint.hpp>, если вы не против полагаться на Boost.Заголовок <inttypes.h> также содержит макросы для спецификаторов формата printf(), которые можно адаптировать для использования с типами <cstdint>Если вы используете C ++, вам следует использовать <iostream>, и, следовательно, вам не нужно беспокоиться о типизированных спецификаторах формата.

1 голос
/ 31 августа 2011

Решение относительно переносимого 32-разрядного целого числа (и тому подобного):

  • Определите свои собственные переносимые типы в каком-то файле ручной сборки или
  • Используйте stdint.h, который сделает это за вас и гарантированно будет в любом компиляторе C, который даже близко совместим с C99.

Что касается printf, stdint.h предоставляет переносимые макросы для printf. Или просто используйте C ++ I / O, и вам не нужно беспокоиться о printf форматах.

1 голос
/ 31 августа 2011

создать один перевод (.cpp), который компилируется с вашей библиотекой / исполняемым файлом. в нем используйте статические утверждения. если вам нужен конкретный размер, этот подход может подтвердить, соответствуют ли ваши объявления условиям, которым они должны соответствовать, прежде чем создавать связываемый / исполняемый двоичный файл, если среда когда-либо изменится.

, затем включите предупреждения компилятора и исправьте то, что должно быть исправлено.

...