2010-09-07 3 views
6

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

Для обсуждения, скажем, файл 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.

ответ

4

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

7

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

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

Edit: Первоначально используемый UINT32_MIN, но Jens Gustedt poited из это одна комбинация подпись/без знака и мин/макс, что не происходит.

+1

Hm, 'UINT32_MIN' не существует. 'UINT32_MAX' или' INT32_MIN' –

+0

+1 для умной идеи. –

+0

@Jens: Каждые два, кажется, предполагают, что такие определения необходимы 1) http://www.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html 2) http://linux-documentation.com/ ru/man/man0p/stdint.h.html – torak

0

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

+0

Это встроенная система, которая не использует Unix или Linux, а ThreadX. Кроме того, он был закодирован до того, как 'stdint.h' стал стандартным. –

+0

@Thomas: Вы, вероятно, запускаете компилятор Green Hills на OS, отличном от ThreadX, например Linux или Windows, правильно? Очень немногие встроенные компиляторы являются самостоятельными. Тем не менее, autoconf/automake звучат как избыток для этой ситуации, и они решают другую проблему: «Как мне сделать код на нескольких платформах, есть ли у них stdint.h или нет?», а не« как мне сделать свой новый код, который использует stdint.h, перестать противоречить этому старому коду, который определяет некоторые из тех же типов? » – bk1e

Смежные вопросы