2015-02-02 4 views
3

Компания, с которой я работаю, предназначена для производства и обслуживания небольших встроенных систем на базе процессора 68k. Мы хотели бы двигаться вперед и прекратить поддерживать тех, кто любит что-то вроде малины Pi, поэтому я работаю над портированием внутренней библиотеки, которая использовалась для написания программного обеспечения для этих устройств, чтобы программы могли быть скомпилированы для Linux.Ограничить размер встроенных типов

Проблема, с которой я столкнулся, заключается в том, что спецификация для этих устройств поддерживает строгие типоразмеры, а именно 16-разрядные для коротких и 32-разрядных для int и long. Поскольку спецификация C только определяет минимальные размеры для типов и наши пользователи были учеными с низким уровнем образования «надлежащее кодированием» мы сталкиваемся с ситуациями, как это весь код пользователя:

typedef struct { 
    short int a; 
    short int b; 
} Pair; 
... 
Pair * p=malloc(4); 

Если можно избежать, мы бы скорее не нужно, чтобы наши пользователи активно переписывали свои программы. Повторная компиляция GCC для этого может быть вариантом, но я хотел бы знать, что это возможно, прежде чем я попытаюсь, потому что я не хочу тратить силы. Поэтому мой вопрос в основном «Есть ли какой-то способ в GCC или другом компиляторе, чтобы заставить типы определенного размера»?

+3

вы можете использовать 'int16_t' и подобные типы. – mch

+0

Я знаю, что «правильное» исправление предназначено для пользователей, чтобы пройти их исходный код и заменить «int» на «int16_t» и тому подобное, но я в основном ищу решение, которое не требует наших десятков внешних компаний переписать тысячи строк исходного кода. –

+2

Кажется, это не проблема для меня. Существующий SW ожидает 16-битный короткий и 32-битный int и long. Вы нашли что-то, что говорит, что у малины Pi нет 16-битного короткого и 32-битного int и long? Дело в том, что спецификация здесь не имеет значения. Ваша задача - выбрать аппаратное обеспечение, которое соответствует требованию, чтобы шорты были 16-битными, а int и длинными 32-битными. Это почти любая 32-битная система, в которую AFAIK входит малина Pi. – user3386109

ответ

1

Вы можете сделать что-то вроде

#define short int16_t

#define int int32_t

и т.д., и добавить его в программу. Это действительно уродливое решение, но оно делает то, что вам нужно.

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

EDIT: С препроцессор не может справиться со старым стилем short int/long int namings. В этих случаях я рекомендую сделать небольшой скрипт, чтобы пройти через исходные файлы и заменить все вхождения int с int32_t, всеми вхождениями shortиshort int с int16_t и т.д.

EDIT на другую второй мысли: в любом случае приведенный вами пример может завершиться неудачно по другой причине: структура использует padding, которая может сделать ее фактический размер больше суммы размеров его содержимого. Итак, чтобы сделать решение переносимым, вам нужно пройти такие вызовы malloc, как в примере, и использовать в них оператор sizeof (в вашем примере вы должны сделать код следующим образом: Pair * p=malloc(sizeof(Pair));), или вы можете использовать более грязное решение и сделать все структуры упакованными, а синтаксис для этого может быть зависимым от компилятора.

+0

Это было одно из первых решений, о которых мы думали, но некоторые из клиентских кодов используют более старый стиль объявлений типа, таких как short int var и long int var, поэтому простые определения часто не работают. –

+4

@SteveRoschard: Я думаю, это, по-моему, оставляет самое очевидное решение: сделайте небольшой скрипт для просмотра исходных файлов и замените все вхождения 'int' на' int32_t', все вхождения 'short' и' short int 'с' int16_t' и т. д. – Mints97

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