2012-05-15 12 views
8

Tôi có mã C sau, có vẻ rất chính xác với tôi. Tuy nhiên, trình biên dịch clang (infact gcc hoặc bất kỳ trình biên dịch C nào khác) cũng nghĩ khác đi.Tôi không hiểu tại sao trình biên dịch lại cho tôi lỗi với mã này

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); 
} 

Trình biên dịch cung cấp thông báo lỗi sau đây &. Bất kỳ ý tưởng gì là sai ở đây?

./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) 

Trả lời

15

Tháo khóa struct (nó không cần thiết vì bạn đã đã typedef ed struct):

void startTimer(Timer* ptimer) 
{ 
    ... 

void stopTimer(Timer* ptimer) 
{ 
    ... 

Ngoài ra, loại bỏ các typedef:

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

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

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

Để biết thêm thông tin, xem Why should we typedef a struct so often in C?

+2

Một giải pháp tốt hơn: không sử dụng typedef! –

+0

William: Nhưng bạn phải tiền tố cấu trúc với một biến cấu trúc trong ANSI C đúng! Trong C++ tôi đồng ý struct là không cần thiết. Bạn không chắc chắn về C99. – pythonic

4

Hoặc bạn

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

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

Hoặc bạn

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

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

Nhưng đừng mixup.

3

Bạn tạo ra một loại gọi là Timer, chỉ cần xóa các cấu trúc từ trước khi các thông số chức năng, như thế này, ví dụ:

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

Các lý do cho các lỗi là, khi bạn nhận được ở đây

void startTimer(struct Timer* ptimer) 

không có struct Timer trong phạm vi (chỉ là typedef cho cấu trúc ẩn danh). Vì vậy, trình biên dịch tin rằng bạn muốn khai báo một mới loại struct Timer và sử dụng một con trỏ trỏ đến đó làm tham số.

Thực tế việc đó sẽ ít hữu ích hơn vì loại chỉ hiển thị bên trong chức năng. Điều đó sẽ làm cho nó thực tế không thể vượt qua trong một tham số từ bên ngoài chức năng.

Vì vậy, trình biên dịch nói rằng, trong khi có thể được phép theo ngôn ngữ, điều này không giống như một ý tưởng hay!