Как сохранить фиксированный размер типов переменных C на разных машинах? - PullRequest
4 голосов
/ 24 марта 2010

У меня есть все такие функции.

ssize_t fuc1(int var1, void *buf, size_t count);
int func2(char *charPtr, int mode, int dev);
short func3( long var2);

проблема в том, что типы данных в C имеют разные размеры при компиляции на разных машинах (64-битной и 32-битной). Это верно для четной пустоты *. По некоторым причинам. Мне нужно убедиться, что все эти размеры одинаковы на каждой машине (64-битной и 32-битной). Итак, как мне изменить их?

Ответы [ 4 ]

12 голосов
/ 24 марта 2010

Используйте типы C99, <stdint.h>, int32_t и т. Д. Подробнее в Википедии .

Нет способа сделать это для типов указателей, потому что они, по определению, зависят от платформы. Не существует действительного варианта использования, в котором вам, возможно, понадобится, чтобы они были согласованными, поскольку они не сериализуемы. Если вы используете переменную указателя для хранения указателя и других данных (например, в зависимости от некоторого флага), используйте объединение некоторого точного целочисленного типа с типом указателя. Либо используйте C99 uintptr_t и приведите к указателю, когда вам нужно обработать его как таковой.

2 голосов
/ 25 марта 2010

Старомодный метод решения вашей дилеммы - использование макросов для определения универсального типа и определения этих макросов на основе целевой платформы:

datatypes.h

#ifndef DATATYPES_H
#define DATATYPES_H

#ifdef PLATFORM_32_BIT
typedef UINT32 unsigned int; // unsigned 32-bit integer
typedef UINT16 unsigned short;
typedef UINT08 unsigned char;
#else
// Assume 64 bit platform
typedef UINT32 unsigned short;
#endif

#endif // DATATYPES_H

Когда вам абсолютно необходима 32-разрядная переменная без знака, вы будете использовать тип UINT32. Определение платформы может быть передано компилятору в командной строке.

Поскольку я не работал на 64-битной платформе, вам придется исследовать размеры битов типов POD.

1 голос
/ 24 марта 2010

Вы не можете, по крайней мере, не в C ++ 03 или C89. C99 имеет заголовок <stdint.h>, который вы можете использовать, который определяет такие типы, как uint32_t и т. Д., Но вам не повезло с C ++.

Если вам нужно, чтобы он работал в C ++ 03, вам нужно использовать что-то вроде Boost :: Integer EDIT или иметь доступную реализацию TR1.

0 голосов
/ 24 марта 2010

Библиотека POSH (Portable Open Source Harness) может вам помочь. Это создано Брайаном Хуком, автором Write Portable Code .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...