Переносимый без знака long в C / C ++ - PullRequest
2 голосов
/ 17 июня 2011
  1. Есть ли в C ++ переносимый без знака long?
  2. Есть ли способ изготовления переносных конструкций?

На моей домашней машине длина без знака составляет 8 байт. На работу машины ее 4 байта. Когда вы запускаете дома приложения, написанные на работе, возникает проблема правильности данных, передаваемых по сети.

Спасибо.

Ответы [ 4 ]

8 голосов
/ 17 июня 2011

#include <stdint.h> для следующих типов:

  • (u)int8_t
  • (u)int16_t
  • (u)int32_t
  • (u)int64_t

Хотя последний может или не может быть доступен, в зависимости от платформы.

5 голосов
/ 17 июня 2011

Тогда не делай этого. Используйте что-то вроде буфер протокола для передачи данных по сети. Сбрасывать структуры в файловые дескрипторы - это плохая идея, и вам не следует этого делать.

Вы можете использовать <stdint.h>, если у вас есть совместимая с C99 реализация C, чтобы убедиться, что используемые вами типы достаточно велики для хранения отправляемых вами данных. Но даже этого недостаточно, поскольку ваша рабочая машина и домашняя машина могут иметь различную бесконечность или любое количество других проблем. <stdint.h> отлично подходит для того, чтобы удостовериться, что ваши переменные достаточно велики, чтобы вместить весь диапазон значений, которые им нужно хранить, но они не являются инструментом, позволяющим убедиться, что вы можете передавать свои данные по сети без головной боли.

2 голосов
/ 17 июня 2011

Как уже упоминалось, использование стандартных размеров данных будет работать (например, из stdint.h.)

Вы можете сделать структуры более переносимыми, используя эти типы данных в сочетании с некоторыми методами, используемыми для повышения переносимости структур данных, такими как выравнивание структуры данных. Как правило, для этого необходимо, чтобы каждое поле было определенным количество байтов, а затем копирование значений в эти байты перед передачей их по сети, записью их в файл и т. д.

0 голосов
/ 17 июня 2011

Большинство платформ имеют typedefs, называемые uint32_t, uint64_t и т. Д., Которые вы можете использовать.Насколько я знаю, они не являются стандартными, но каждая платформа, которую я использовал, имела их.

...