2010-09-07 12 views
6

Pracuję ze starszym osadzonym kodem C, który definiuje typy uint8_t, uint16_t i uint32_t w pliku nagłówkowym, używając słowa kluczowego typedef.Skompiluj sprawdzanie czasu istnienia stdint.h

W celu omówienia, powiedzmy, że plik typedefs.h zawiera te definicje.

W moim nowym module źródłowym C uwzględniam stdint.h. Dołączam także inne pliki nagłówkowe, które zawierają typedefs.h gdzieś w hierarchii. Zgodnie z oczekiwaniami kompilator narzeka na wiele zdefiniowanych symboli.

chciałbym zmodyfikować plik starszego typedefs.h tak, że tylko deklaruje typy uint*_t jeśli albo stdint.h nie jest wliczony lub lepiej jeśli rodzaje uint*_t nie są zdefiniowane.

Rozumiem, że #ifndef nie może być używany, ponieważ typedef nie jest dyrektywą preprocesora.

Więc w jaki sposób mogę powiedzieć kompilatorowi, aby nie definiować uint*_t, jeśli już istnieją (lub jeśli stdint.h jest już dołączony)?

Uwaga: byłoby to łatwe, gdyby zdefiniowany standard specyfikacji C zawierał definicje strażników dla plików nagłówkowych.

FWIW, Używam kompilatora Green Hills, 4.24, dla procesora ARM9.

Odpowiedz

4

Po prostu napraw starszy nagłówek, aby zawsze zawierał stdint.h, aby uzyskać te typy, usunąć zduplikowane definicje i dostarczyć plik dodatkowy stdint.h dla uszkodzonych systemów, które go nie mają.

7

Uważam, że stdint.h powinno również definiować makro dla limitów typów, które on definiuje. Powinieneś być w stanie przetestować dla tych używających #ifdef i tym podobnych.

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

Edit: Początkowo stosowany UINT32_MIN, ale Jens Gustedt poited się to jedna kombinacja podpisany/unsigned i Min/Max, że nie występuje.

+1

Hm, 'UINT32_MIN' nie istnieje. 'UINT32_MAX' lub' INT32_MIN' –

+0

+1 za sprytny pomysł. –

+0

@Jens: Dwa poniższe przykłady sugerują, że takie definicje są wymagane 1) http://www.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html 2) http://linux-documentation.com/ pl/man/man0p/stdint.h.html – torak

0

Jeśli korzystasz z systemu UNIX, wykonaj kopię zapasową kroku i użyj pakietu konfiguracyjnego, takiego jak autoconf (1) lub automake (1). Jest przeznaczony do obsługi takich problemów.

+0

To jest wbudowany system, który nie używa systemu Unix ani Linux, ale ThreadX. Ponadto został zakodowany, zanim 'stdint.h' stał się standardem. –

+0

@Thomas: Prawdopodobnie uruchamiasz kompilator Green Hills na systemie operacyjnym innym niż ThreadX, takim jak Linux lub Windows, prawda? Bardzo niewiele wbudowanych kompilatorów samo-hostuje. Powiedział, że autoconf/automake brzmi jak przesada w tej sytuacji i rozwiązują inny problem: "w jaki sposób mogę skompilować mój kod na wielu platformach, czy mają stdint.h czy nie?", a nie" w jaki sposób mogę uczynić mój nowy kod, który używa stdint.h przestają być w konflikcie z tym starym kodem, który definiuje niektóre z tych samych typów? " – bk1e

Powiązane problemy