Время компиляции, проверяющее существование stdint.h

Я работаю со старым встроенным кодом 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.

3 ответа

Решение

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

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

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

Редактировать: Изначально использовал UINT32_MIN, но, как сказал Дженс Гастдт, это единственная комбинация со знаком / без знака и мин / макс, которая не возникает.

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

Другие вопросы по тегам