2010-11-02 36 views
5

Nếu tôi khai báo và không bao giờ sử dụng biến thì gcc sẽ cảnh báo cho tôi.Làm thế nào để kiểm tra các thành viên chưa sử dụng trong cấu trúc?

Nhưng nếu tôi có một cấu trúc với một số thành viên và một số người không được sử dụng, gcc sẽ không cảnh báo về nó ...

Có một tùy chọn (hoặc phương pháp khác) để kiểm tra này?

(Tất nhiên tôi có thể xóa một số mục nhập theo cách thủ công và cố gắng biên dịch lại, nhưng tôi đang tìm cách tiếp cận này).

Cảm ơn

+0

Còn 'grep' thì sao? –

+0

Vâng, tôi khuyên bạn nên grepping cho tên thành viên và xem nếu nó đi lên nhiều hơn một lần. Bạn có thể viết kịch bản –

+0

Có, nhưng vui lòng xem câu trả lời của tôi. –

Trả lời

5

Không GCC sẽ không cảnh báo về điều này. Chủ yếu là vì trong đa số trường hợp có hay không một thành viên được sử dụng không thể được xác định. Một phần tốt của struct được xác định trong tệp tiêu đề. Điều này có thể được sử dụng bởi không chỉ ứng dụng của bạn mà bởi bất kỳ ứng dụng nào khác tham chiếu đến tệp .lib của bạn hoặc sử dụng cùng một tệp tiêu đề. Do đó chỉ vì đoạn mã hiện tại đang được biên dịch không sử dụng thành viên nó không có nghĩa là thành viên không được sử dụng bởi một số đoạn mã khác.

Biến cục bộ khác nhau. Có hay không chúng được sử dụng dễ dàng xác định bằng cách chỉ biên dịch hàm được đề cập. Do đó GCC, và nhiều trình biên dịch khác, đưa ra một cảnh báo.

+1

Cấu trúc cũng có thể có các thành viên trong đó để đệm và căn chỉnh; bạn có thể không muốn cảnh báo GCC về những điều này. –

3

Bạn có thể truy cập hợp pháp và hợp lý thành viên đầu tiên của một cấu trúc mà không sử dụng tên của nó, chỉ đơn giản bằng cách truyền cấu trúc cho loại thành viên đầu tiên.

typedef struct { 
    int x; 
} mystruct; 

mystruct s; 
*(int*)&s = 3; 

Bạn cũng có thể không di chuyển được, nhưng với độ tin cậy gần như 100%, truy cập bất kỳ trường nào trong cấu trúc mà không sử dụng tên của cấu trúc đó.

typedef struct { 
    int x; 
    char y; 
} mystruct; 

typedef struct { 
    int a; 
    char b; 
} otherstruct; 

mystruct s; 
((otherstruct*)&s)->b = 'C'; 

Tôi e rằng điều này có nghĩa là không tìm kiếm nguồn cho tên của trường và cũng không xóa tên, hoàn toàn đáng tin cậy.

+1

Bạn cũng có thể sử dụng macro 'offsetof()' chuẩn, điều này sẽ cho phép bạn làm điều gì đó giống như ví dụ thứ hai của bạn một cách hợp pháp và hợp lý. –

+0

Đó là khá chính xác, mặc dù bạn ít nhất sẽ tìm thấy điều này khi bạn tìm kiếm mã nguồn. –

+0

+1 Đó là một quan điểm tốt. –

Các vấn đề liên quan