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