Вопрос

Я работаю с устаревшим встроенным C-кодом, который определяет типы uint8_t, uint16_t а также uint32_t в заголовом файле, используя typedef ключевое слово.

Для обсуждения, давайте скажем файл typedefs.h Содержит эти определения.

В моем новом исходном модуле C я включаю stdint.h. Отказ Я также включаю другие файлы заголовка, которые включают typedefs.h Где-то в иерархии. Как и ожидалось, компилятор жалуется на несколько определенных символов.

Я хотел бы изменить устаревший файл typedefs.h Так что это только объявляет uint*_t Типы, если либо stdint.h не включен или лучше, если uint*_t Типы не определены.

Мое понимание в том, что #ifndef не может быть использован, так как typedef не является директивой препроцессора.

Так как я могу сказать компилятору не определять uint*_t Если они уже существуют (или если stdint.h уже включен)?

Примечание. Это было бы легко, если стандарт определенного спецификации C включает в себя определения охранника для файлов заголовка.

FWIW, я использую компилятор Green Hills, 4,24, для процессора ARM9.

Это было полезно?

Решение

Просто исправьте наследие, чтобы всегда включить stdint.h Чтобы получить эти типы, удалите дубликаты определений и предоставьте файл Drop-In stdint.h для сломанных систем, которые не хватает его.

Другие советы

Я верю, что stdint.h Следует также определять макрос для пределов типов, которые он определяет. Вы должны быть в состоянии проверить для тех, кто использует #ifdef и тому подобное.

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif

Редактировать: Первоначально использовал uint32_min, но как jens gustedt poed, это одно сочетание подписанных / беззнаков и мин / макс, которые не происходят.

Если вы находитесь в системе Unix, вы должны выполнить резервное копирование шага и использовать пакет конфигурации, такой как Autoconf (1) или Automake (1). Он предназначен для решения таких проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top