2013-11-01 13 views
32

tôi chỉ là bây giờ biết về lá cờ __unused có thể được sử dụng khi biên dịch với GCC và tôi càng tìm hiểu về nó, những câu hỏi tôi càng có ...__unused Cờ Behavior/Cách sử dụng (GCC với Objective C)

Tại sao điều này biên dịch mà không có cảnh báo/lỗi? Nó có vẻ lạ mà tôi đặc biệt nói với trình biên dịch tôi sẽ không sử dụng một biến, sau đó khi tôi sử dụng nó, mọi thứ diễn ra như bình thường.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self foo:0]; 
} 

- (void)foo:(NSInteger)__unused myInt 
{ 
    myInt++; 
    NSLog(@"myInt: %d", myInt); // Logs '1' 
} 

Ngoài ra, sự khác biệt giữa hai chữ ký phương pháp sau đây là gì?

- (void)foo:(NSInteger)__unused myInt; 

- (void)foo:(NSInteger)myInt __unused; 
+0

Chúng tương đương và bạn cũng có thể viết '- (void) foo: (__ không sử dụng NSInteger) myInt;' và '- (void) foo: (NSInteger __unused) myInt;'. –

Trả lời

72

Các __unused vĩ mô (mà thực chất là mở rộng đến các thuộc tính __attribute__((unused)) GCC) chỉ cho trình biên dịch "không cảnh báo cho tôi nếu tôi không sử dụng biến này".

unused: Thuộc tính này, được đính kèm với biến, có nghĩa là biến có nghĩa là có thể không được sử dụng. GCC không đưa ra cảnh báo cho biến này. (Source: gnu.gcc.org doc)

Vì vậy, thuộc tính này GCC là tránh một cảnh báo khi bạn không sử dụng một biến, và KHÔNG để kích hoạt một khi bạn sử dụng các biến bạn tuyên bố không sử dụng.


Như liên quan đến việc các thuộc tính trước hoặc sau tên biến trong ví dụ cuối cùng của bạn, cả hai đều chấp nhận và tương đương trong trường hợp của bạn: trình biên dịch chỉ là nhân hậu về điều đó vị trí cho các mục đích tương thích (khá như bạn cũng có thể viết được cả const int i hoặc int const i)

đối với khả năng tương thích với mã hiện bằng văn bản cho các phiên bản trình biên dịch mà không thực hiện các thuộc tính trên declarators lồng nhau, một số sự dễ dãi được cho phép trong việc đặt các thuộc tính (Source: gnu.gcc.org doc)

+0

RHS có an toàn không được tối ưu hóa bởi trình biên dịch không? – fabb

4

Tính đến Xcode 7.3.1, hiện nay có sự khác biệt giữa:

- (void)foo:(NSInteger)__unused myInt;// [syntax 1] 
- (void)foo:(NSInteger __unused)myInt;// [syntax 2] 
- (void)foo:(__unused NSInteger)myInt;// [syntax 3] 

Nhưng sau không làm việc:

- (void)foo:(NSInteger)myInt __unused;// [doesn't work] 

Đối với việc sử dụng về vấn đề này, Apple recommends first syntax. (information was partially taken from this answer)

Nhưng có sự khác biệt giữa:

__unused NSString *foo, *bar; // [case a] attribute applies to foo and bar 
NSString *foo __unused, *bar; // [case b] attribute applies to foo only 

NSString * __unused foo, *bar; // [case c] attribute applies to foo only 
NSString __unused *foo, *bar; // [case d] attribute applies to foo and bar 
CFStringRef __unused foo, bar; // [case e] attribute applies to foo and bar 

Nếu chúng ta muốn __unused để áp dụng cho tất cả, cú pháp [a] là tốt nhất cá nhân của tôi vì nó không để lại mơ hồ.

Nếu chúng tôi muốn __unused để áp dụng cho một, cú pháp [b] là tốt nhất cá nhân của tôi vì nó không để lại sự mơ hồ.

Ba giải pháp sau có thể chấp nhận được nhưng gây nhầm lẫn theo ý kiến ​​của tôi.(information was partially taken from this answer)

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