Компиляция времени проверки наличия 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.
Решение
Просто исправьте наследие, чтобы всегда включить 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). Он предназначен для решения таких проблем.