我正在開發一種提供某種類型接口的嵌入式系統。錯誤:'whatever'的衝突類型
的問題是通過包括某些頭從C標準庫,我得到一個error: conflicting types
我用gettimeofday
和我只使用struct timeval
,但使用這種sys/time.h
也time_t
拖累其與定義的干擾系統。
我無法觸摸任何一段代碼,我都需要它們。
有沒有辦法解決這些問題? (我應該能夠使用系統聲明的類型和c頭中聲明的某些函數,這些函數頭包含系統已經完成的一些聲明。)
我正在開發一種提供某種類型接口的嵌入式系統。錯誤:'whatever'的衝突類型
的問題是通過包括某些頭從C標準庫,我得到一個error: conflicting types
我用gettimeofday
和我只使用struct timeval
,但使用這種sys/time.h
也time_t
拖累其與定義的干擾系統。
我無法觸摸任何一段代碼,我都需要它們。
有沒有辦法解決這些問題? (我應該能夠使用系統聲明的類型和c頭中聲明的某些函數,這些函數頭包含系統已經完成的一些聲明。)
您可以使用宏來重命名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>
這是不能保證工作,但它確實工作很多時間。
不錯,簡單。它可能有點微妙,如果有人移動#包括,或有兩個time_t字段。否則,漂亮。 – gbulmer 2012-03-24 01:27:32
如果它只有一個函數(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,它與正在衝突的內容相同。衝突已經分離。
是嗎?
解決這個問題的一種方法是或多或少地採用另一種抽象級別,並提供封裝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);
....
}
如果在同一源文件中需要具有相同名稱的不同事物,則除重命名其中一個外,沒有太多選擇。 – 2012-03-24 00:08:43
你能提供一些代碼嗎? – 2012-03-24 00:09:55
@netrom我使用gettimeofday,我只使用結構timeval,但爲了使用此我sys/time.h還drags time_t干擾系統定義的一個。 – w00t 2012-03-24 00:11:48