Время компиляции, проверяющее существование stdint.h - PullRequest
7 голосов
/ 07 сентября 2010

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

7 голосов
/ 07 сентября 2010

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

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

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

4 голосов
/ 07 сентября 2010

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

0 голосов
/ 08 сентября 2010

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

...