2012-05-15 222 views
8

我有以下C代碼,這對我來說看起來非常正確。但是,clang編譯器(實際上gcc或任何其他C編譯器)都認爲不然。我不明白爲什麼編譯器給我錯誤代碼

typedef struct 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
} Timer; 

void startTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

void stopTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_end), NULL); 
} 

該編譯器給出了以下waring &錯誤消息。任何想法這裏有什麼錯誤?

./timing.h:14:25: warning: declaration of 'struct Timer' will not be visible 
     outside of this function [-Wvisibility] 
void startTimer(struct Timer* ptimer) 
         ^
./timing.h:16:27: error: incomplete definition of type 'struct Timer' 
    gettimeofday(&(ptimer->td_start), NULL); 
        ~~~~~~^ 
./timing.h:14:25: note: forward declaration of 'struct Timer' 
void startTimer(struct Timer* ptimer) 
         ^
./timing.h:19:24: warning: declaration of 'struct Timer' will not be visible 
     outside of this function [-Wvisibility] 
void stopTimer(struct Timer* ptimer) 
        ^
./timing.h:21:27: error: incomplete definition of type 'struct Timer' 
    gettimeofday(&(ptimer->td_end), NULL); 
        ~~~~~~^ 
./timing.h:19:24: note: forward declaration of 'struct Timer' 
void stopTimer(struct Timer* ptimer) 

回答

15

取出struct關鍵字(這是沒有必要的,因爲你已經typedef編的結構):

void startTimer(Timer* ptimer) 
{ 
    ... 

void stopTimer(Timer* ptimer) 
{ 
    ... 

另外,除去typedef

struct Timer 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
}; 

void startTimer(struct Timer* ptimer) 
{ 
    ... 

void stopTimer(struct Timer* ptimer) 
{ 
    ... 

欲瞭解更多信息,見Why should we typedef a struct so often in C?

+2

更好的解決方案:不要使用typedef! –

+0

William:但是你必須在ANSI C的右邊結構變量的前綴結構!在C++中,我同意結構是不需要的。不知道C99。 – pythonic

4

要麼你

struct Timer 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
}; 

void startTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

或者你

typedef struct 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
} Timer; 

void startTimer(Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

但不要查詢股價。

3

您創建了一個名爲定時器類型,函數參數之前只是刪除字結構,像這樣的,例如:

void startTimer(Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 
2

的錯誤原因是,當你來到這裏

void startTimer(struct Timer* ptimer) 

範圍內沒有struct Timer(只是匿名結構的typedef)。所以編譯器相信你想要聲明一個新的類型struct Timer並使用一個指針作爲參數。

實際上這樣做會不太有用,因爲該類型只會在內部可見這個函數。這將使得實際上不可能從之外的參數中傳遞該參數的功能。

所以編譯器說,雖然可能允許的語言,這看起來不是一個好主意!

相關問題