2012-03-24 104 views
3

我正在開發一種提供某種類型接口的嵌入式系統。錯誤:'whatever'的衝突類型

的問題是通過包括某些頭從C標準庫,我得到一個error: conflicting types

我用gettimeofday和我只使用struct timeval,但使用這種sys/time.htime_t拖累其與定義的干擾系統。

我無法觸摸任何一段代碼,我都需要它們。

有沒有辦法解決這些問題? (我應該能夠使用系統聲明的類型和c頭中聲明的某些函數,這些函數頭包含系統已經完成的一些聲明。)

+0

如果在同一源文件中需要具有相同名稱的不同事物,則除重命名其中一個外,沒有太多選擇。 – 2012-03-24 00:08:43

+0

你能提供一些代碼嗎? – 2012-03-24 00:09:55

+0

@netrom我使用gettimeofday,我只使用結構timeval,但爲了使用此我sys/time.h還drags time_t干擾系統定義的一個。 – w00t 2012-03-24 00:11:48

回答

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

不錯,簡單。它可能有點微妙,如果有人移動#包括,或有兩個time_t字段。否則,漂亮。 – gbulmer 2012-03-24 01:27:32

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 
} 

創建新的類型struct 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); 
    .... 
}