2008-11-12 28 views
15

Có thể sử dụng macro thuộc tính __unused trên các tham số phương thức đối tượng Objective-C không? Tôi đã thử đặt nó ở các vị trí khác nhau xung quanh khai báo tham số nhưng nó gây ra lỗi biên dịch hoặc có vẻ bị bỏ qua (tức là, trình biên dịch vẫn tạo cảnh báo tham số không sử dụng khi biên dịch với -Wall -Wextra).Sử dụng thuộc tính GCC __unused với Objective-C

Có ai có thể sử dụng tính năng này không? Nó chỉ không được hỗ trợ với Objective-C? Để tham khảo, tôi hiện đang sử dụng bản dựng GCC 4.0.1 của Apple.

Trả lời

18

OK, tôi đã tìm thấy câu trả lời ... dường như là lỗi với việc triển khai gcc 4.0 của Apple. Sử dụng gcc 4.2 nó hoạt động như mong đợi và vị trí thích hợp như sau:

-(void)someMethod:(id) __unused someParam; 

Nó ghi nhận trong bản phát hành Objective-C ghi chú nếu có ai quan tâm: http://developer.apple.com/releasenotes/Cocoa/RN-ObjectiveC/index.html#//apple_ref/doc/uid/TP40004309-DontLinkElementID_6

Là một lưu ý, câu trả lời của bạn sẽ biên dịch, Louis, nhưng như tôi đã nói trong câu hỏi của tôi nó sẽ không thực sự làm bất cứ điều gì hoặc ngăn chặn các cảnh báo không sử dụng do trình biên dịch.

EDIT: Tôi đã gửi báo cáo lỗi với quả táo cho số rdar://6366051 này.

2

tôi có thể biên dịch như sau tốt:

- (NSString *) test:(__unused NSString *)test { 
    return nil; 
} 

Chỉnh sửa: Thực ra, đó có thể không đúng là một điều vòm:

Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror 
Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror -Wunused-parameter 
cc1obj: warnings being treated as errors 
Pusher.m:40: warning: unused parameter ‘test’ 
Phoenix-VI:CouchPusher louis$ 

Vì vậy, Wall không bao gồm việc không bao gồm -Wunused- tham số ....

+0

Yeah, tôi có thể biên dịch đó quá, nhưng cố gắng gcc -Wall -Wextra và xem những gì sẽ xảy ra :) –

+0

Không, Wall doesn 't, bạn cần phải sử dụng -Wextra cho rằng ... nhưng tôi luôn luôn sử dụng cả hai -Wall và -Wextra trên mã của tôi và tôi nhận được khó chịu với tiếng ồn cảnh báo không sử dụng. –

+0

Tôi sử dụng -Werror và hầu hết các cảnh báo, nhưng tôi có một vài cảnh báo cụ thể theo cách truyền thống, các tham số -Wunused là một trong số chúng, vì các đại biểu thường có các tham số không sử dụng mà không thể gỡ bỏ. –

3

Tôi nghĩ bạn có thể sử dụng #pragma không được sử dụng để đánh dấu đối số là không sử dụng. Chưa được kiểm tra, nhưng bạn có thể thử một cái gì đó giống như

- (NSString *)test:(NSString *)test { 
#pragma unused (test); 
    return nil; 
} 
+1

Bạn cần phải đặt biến trong các dấu ngoặc đơn cho #pragma không được sử dụng. Vì vậy: #pragma không sử dụng (bộ đếm thời gian) hoạt động nhưng tôi không thực sự thích cách hoạt động. Hóa ra đó là lỗi. –

3

Một thành ngữ phổ biến là sử dụng như sau:

#define UNUSED(x) (void)x 
void SomeFunction(int param1, int param2) 
{ 
    UNUSED(param2); 
    // do stuff with param1 
}

Tuyên bố UNUSED(param2) không tạo ra bất kỳ mã đối tượng, loại bỏ cảnh báo về biến không sử dụng, và rõ ràng tài liệu mã như không sử dụng biến.

+0

Trên thực tế, trong trường hợp này, với -Wall -Wextra bạn kết thúc bằng một tuyên bố không có cảnh báo hiệu lực :) –

+0

Cố định - bỏ trống để loại bỏ cảnh báo đó –

+0

Xin lỗi bạn đã gặp khó khăn. Kể từ khi không sử dụng là một gợi ý trình biên dịch, không phải là chỉ có hiệu quả như -Wno-không sử dụng? – wjl

1

Sau khi chiến đấu với #pragma một thời gian, tôi phát hiện ra nó

+ (NSString*) runQuery:(id)query name:(NSString*)name options:(NSDictionary*)options 
{ 
#pragma unused(name) 
... 

} 
+0

Vâng, tôi thực sự muốn đặt từ khóa không được sử dụng trong dòng phương thức. Vì lý do nào đó, tôi cảm thấy nó "thuộc về" ở đó.Dù sao, theo Apple nó chỉ đơn giản là không được hỗ trợ trên GCC trước phiên bản 4.2, do đó, đó là điều đó. Nếu không, nếu sử dụng 4.2 hoặc cao hơn, nó hoạt động như bạn mong đợi :) –

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