2012-03-24 4 views
3

Я работаю над встроенными системами, которые предоставляют интерфейс с определенными типами.ошибка: конфликтующие типы для 'whatever'

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

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

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

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

+0

Если вам нужны разные вещи с тем же именем в том же исходном файле, у вас нет большого выбора, кроме как переименовать одну из вещей. –

+0

Не могли бы вы предоставить код? –

+0

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

ответ

4

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

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

#include <header_which_defines_the_time_t_you_want.h> 

Это не гарантируется, но это действительно работает много времени.

+0

Ницца и просто. Это может быть немного деликатно, если кто-то перемещает #includes around, или есть два поля time_t. В противном случае, отличный. – gbulmer

1

Если это только одна функция (gettimeofday) и один тип, создайте функцию «обертка» в отдельном файле исходного кода, включите правильный заголовок для вызова 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 
} 

Придумайте новый тип, структуры my_timeval, что то же самое содержание, как тот, что в настоящее время вступает в противоречие с. Конфликты были разделены.

Это он?

2

Один из способов обойти это, как более или менее последнее средство - ввести еще один уровень абстракции и предоставить 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); 
    .... 
} 
Смежные вопросы