ошибка: конфликтующие типы для "что угодно" - PullRequest
3 голосов
/ 24 марта 2012

Я работаю над встроенными системами, которые предоставляют интерфейс с определенными типами.

Проблема в том, что при включении некоторых заголовков из стандартной библиотеки c я получаю error: conflicting types

Я использую gettimeofday, и я использую только struct timeval, но для использования этого sys/time.h также перетаскивает time_t, что мешает определенному системой.

Я не могу прикоснуться ни к одному из этих кусков кода, и мне нужны оба.

Есть ли способ обойти такие проблемы? (Я должен быть в состоянии использовать объявленные системой типы и некоторые функции, объявленные в заголовках c, заголовки, которые содержат некоторые объявления, уже сделанные системой.)

Ответы [ 3 ]

5 голосов
/ 24 марта 2012

Вы можете использовать макросы для переименования одной из time_t typedefs без изменения каких-либо заголовков:

#define time_t LIBC_time_t
#include <sys/time.h>
#undef time_t

#include <header_which_defines_the_time_t_you_want.h>

Это не гарантированно работает, но это работает большую часть времени.

2 голосов
/ 24 марта 2012

Один из способов обойти это, как более или менее последнее средство, - ввести другой уровень абстракции и предоставить API-оболочки для изоляции проблемных заголовков.

Если у вас есть что-то вроде этого:

my_file.c:

#include <sys/time.h>
#include <some_system_header.h>

void foo(void)
{
     struct timeval tv;
     gettimeofday(&tv);
     ....
}

превращается в

my_gettimeofday.c:

#include <sys/time.h> //only sys.time.h here, no system headers
#include "my_gettimeofday.h"

void my_gettimeofday(struct my_timeval *my_tv)
{
   struct timeval tv;
   gettimeofday(&tv);
   my_tv->sec  = tv.tv_sec;
   my_tv->usec = tv.tv_usec;
}

my_gettimeofday.h:

struct my_timeval {
   long sec, usec; //adjust to your platform if needed
};
void my_gettimeofday(struct my_timeval *my_tv);

my_file.c:

//no sys/time.h here.
#include <some_system_header.h>
#include "my_gettimeofday.h"
void foo(void)
{
     struct my_timeval tv;
     my_gettimeofday(&tv);
     ....
}
1 голос
/ 24 марта 2012

Если это только одна функция (gettimeofday) и один тип, создайте функцию 'wrapper' в отдельном файле исходного кода, включите правильный заголовок для вызова gettimeofday.

int my_gettimeofday(struct my_timeval *restrict tp, void *restrict tzp) {
    timeval t;
    t.time_t = my_timeval.time_t;
    // ...
    int ret = gettimeofday(&t, tzp);
    my_timeval.time_t = t.time_t;
    // .. copy the others
}

Inventновый тип struct my_timeval, содержимое которого совпадает с тем, с которым конфликтуют.Конфликты разделились.

Это так?

...