Konflikt typów w projekcie

Mam Ci ja projekt, w którym istnieje plik typy_danych.h, w którym są deklaracje następujących typów:

  • uint8_t
  • uint16_t
  • uint32_t, etc.

[Inteligent z armii który to wymyślił, powinien spaść z konia i sobie zrobić kuku w głowę, ale w czasach jak powstawał kod, nikt nie myślał o kompilowaniu go pod gcc, co odrobinę usprawiedliwia sytuację]

I mam plik stdint.h w katalogu nagłówków kompilatora. Próba pożenienia jednego z drugim, budzi w kompilatorze konflikty deklaracji typów!

Problem: Nie mogę poprawić ani nagłówka systemowego, ani zmienić pliku typy_danych.h, który w plikach w których występuje konflikt nie jest wciągany bezpośrednio, ale jest efektem kaskady #include<>ów. Muszę jednak jakoś zmusić ten kod do skompilowania się.

Pytanie: Kto zna jakiś trick, który pozwoli osiągnąć ten stan rzeczy? Najlepiej zmusić kompilator do przedefiniowania typów - da się?

Informacja pomocnicza: Kompilator mingw32 gcc 4.4.0.

  • To fakt, że untypedef nie wszedł do języka C. #ifdefów brak i tu i tam, ale... ale... sformułowanie tego pytania w tym serwisie zawiodło mnie w kierunku nowego rozumowania:

    /* Let's hack the conficts :-P */
    #define int8_t chwdk_int8_t
    #define int16_t chwdk_int16_t
    #define int32_t chwdk_int32_t
    #define int64_t chwdk_int64_t
    #define uint64_t chwdk_uint64_t
    #include "dbg.h"
    #include "second.h"
    #include "os_api.h"
    #include "fourth.h"
    #include "fifth.h"
    #include "msg_data_type.h"
    #undef uint64_t
    #undef int8_t
    #undef int16_t
    #undef int32_t
    #undef int64_t
    

    I kompilacja się powiodła :-)

    Oczywiście, takie postępowanie ma swoje ujemne strony. Jeżeli któryś z prototypów funkcji korzystałby z przemianowanych typów danych, a chciałbym je wykorzystać w swoim fragmencie kodu, mogłoby to nie zadziałać. Na szczęście ten których potrzebuję, nie mają tego problemu; a ja i tak potrzebowałem enumy.

  • Wnioskuję że typy są zdefiniowane przez typedef cośtam uint8_t, a nie #define uint8_t cośtam (nie napisałeś tego, ale przy takim "genialnym" nagłówku można się było spodziewać różnych cudów). W tym drugim przypadku #undef i po problemie, ale typedefa nie da się odkręcić.

  • Kilka dodatkowych pytań: jak wygląda plik typy_danych.h?

    czy definicje typów znajdujące się w tym pliku są opakowane w jakieś ifdefy? #ifdef WIN przykładowo?

    Odpowiedź na twoje pytanie: jeżeli w obu plikach typy te zostały zdefiniowane przez typedef i nie zostały opakowane przez jakiegoś ifdefa w typydanych.h to kaplica;) No chyba, że jednak się postarasz i zmodyfikujesz typydanych.h dodając ifdefa na tworzenie nowych typów - to zdecydowanie najlepsze rozwiązanie by było!

Zaloguj się, aby dodać swoją odpowiedź