Làm cách nào để loại bỏ cảnh báo "biến không được sử dụng" trong Xcode?


98

Tôi hiểu chính xác lý do tại sao cảnh báo biến không sử dụng xảy ra. Tôi không muốn loại bỏ chúng nói chung, bởi vì chúng cực kỳ hữu ích trong hầu hết các trường hợp. Tuy nhiên, hãy xem xét đoạn mã (tiếp theo) sau đây.

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode báo cáo rằng đó savedlà một biến không được sử dụng, tất nhiên là không. Tôi nghi ngờ điều này là vì NSAssert1là một vĩ mô. Các NS_BLOCK_ASSERTIONSvĩ mô được không được xác định, do đó khẳng định C Mục tiêu chắc chắn kích hoạt.

Mặc dù nó không ảnh hưởng gì, nhưng tôi thấy nó bừa bộn và khó chịu, và tôi muốn kìm nén nó lại, nhưng tôi không biết phải làm như thế nào. Việc gán biến cho chính nó sẽ loại bỏ cảnh báo của trình biên dịch, nhưng tôi muốn làm điều đó theo cách "đúng" nếu điều đó tồn tại.

Câu trả lời:


107

Tôi không chắc liệu nó có còn được hỗ trợ trong trình biên dịch LLVM mới hay không, nhưng GCC có một thuộc tính "không được sử dụng" mà bạn có thể sử dụng để loại bỏ cảnh báo đó:

BOOL saved __attribute__((unused)) = [moc save:&error];

Ngoài ra (trong trường hợp LLVM không hỗ trợ ở trên), bạn có thể chia khai báo biến thành một dòng riêng biệt, đảm bảo rằng biến sẽ được "sử dụng" cho dù macro có mở rộng hay không:

BOOL saved = NO;
saved = [moc save:&error];

107

Sử dụng Xcode 4.3.2 và phát hiện ra rằng điều này dường như hoạt động (viết ít hơn)

BOOL saved __unused;

Điều này không làm việc cho tôi, tôi nhận được một cảnh báo rằng'saved' was marked as unused but was used
Heath Borders

37

Trong Xcode, bạn có thể đặt cảnh báo cho "Các biến không được sử dụng". Đi tới "Cài đặt xây dựng" cho mục tiêu và lọc với từ "không sử dụng"

Đây là ảnh chụp màn hình: Ảnh chụp màn hình cài đặt Builld

Tôi đề nghị bạn chỉ thay đổi nó cho Debug. Bằng cách đó, bạn không bỏ lỡ bất kỳ điều gì trong phiên bản phát hành của mình.


37
Bạn có bỏ lỡ phần của câu hỏi mà Gregory nói "Tôi không muốn đàn áp chúng nói chung, bởi vì chúng cực kỳ hữu ích trong hầu hết các trường hợp"?
Sherm Pendley,

8
@ShermPendley Bất chấp điều này vẫn hữu ích, nó đã trả lời câu hỏi của tôi về cách tắt nó trên toàn cầu.
raffian

9
tắt cảnh báo là một cách tuyệt vời để bỏ sót lỗi. Tôi rất khuyên bạn nên chống lại.
orion elenzil

2
@orionelenzil - tốt, có và không. Có một vấn đề giao diện thực sự với kết quả dương tính giả. Cảnh báo bật lên liên tục trong khi bạn đang viết mã nếu bạn chưa đến phần mã mà bạn sử dụng biến. Theo thời gian, điều này sẽ huấn luyện bạn bỏ qua cảnh báo nghĩa là bạn có thể bỏ sót nhiều lỗi quan trọng hơn. Sẽ tốt hơn nếu có thể ngăn chặn lỗi trong các khối mã đang được chỉnh sửa tích cực.
TechZen

Xin chào, nó hoạt động tốt nếu tôi đặt KHÔNG. nhưng nghi ngờ của tôi là: tôi phải đặt Debug & Release NO ya only Biến không sử dụng: KHÔNG? cái nào tôi phải đặt. Nếu tôi đặt Hoàn toàn KHÔNG, thì nó không tạo ra bất kỳ xác suất nào trong quá trình phát hành na?
SR Nayak

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Hãy thử như thế này. Đó là làm việc cho tôi. Nó cũng sẽ làm việc cho bạn.


Điều này không làm việc cho tôi, tôi nhận được một cảnh báo rằng'saved' was marked as unused but was used
Heath Borders

15

Cách đơn giản và dễ di chuyển duy nhất để đánh dấu biến đã được sử dụng là… sử dụng nó.

BOOL saved = ...;
(void)saved; // now used

Tuy nhiên, bạn có thể hài lòng với các tiện ích mở rộng dành riêng cho trình biên dịch đã được mô tả.


2
Tôi thích điều này hơn so với #pragma xấu xí được mô tả ở trên.
northernman

1
Này anh bạn, mẹo hay
dimazava

13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

NGUỒN


Đây là cách tiếp cận sạch sẽ nhất vì nó chỉ vô hiệu hóa cảnh báo giữa các
#pragmas đó


5

Bạn có thể đặt cảnh báo "Không" LLVM phàn nàn 2.0 trên "Phát hành"nhập mô tả hình ảnh ở đây


4

Đây là cách bạn làm trong C và do đó cũng là Objective-C.

Mặc dù bạn không bật cảnh báo, nhưng bạn nên đánh dấu giá trị trả về là bị bỏ qua một cách rõ ràng. Nó cũng cho các nhà phát triển khác thấy rằng bạn không chỉ quên về giá trị trả về - bạn thực sự đã chọn bỏ qua nó một cách rõ ràng.

(void)[moc save:&error];

CHỈNH SỬA: Các trình biên dịch bỏ qua các phôi đối với void, vì vậy nó sẽ không ảnh hưởng đến hiệu suất - đó chỉ là một chú thích của con người sạch đẹp.


Trong một số ngữ cảnh nhất định, bạn PHẢI sử dụng bản hack này để lấy mã Objective-C để biên dịch. Sử dụng (void)là cách rõ ràng nhất để đi, cảm ơn!
Dan Rosenstark

1

Làm cho nó chiếm hai dòng. Tách khai báo và giá trị mặc định

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.