Có cách nào để ngăn chặn cảnh báo trong Xcode không?


119

Có cách nào để ngăn chặn cảnh báo trong Xcode không?

Ví dụ: tôi đang gọi một phương thức không có tài liệu và vì phương thức không có trong tiêu đề nên tôi nhận được cảnh báo khi biên dịch. Tôi biết tôi có thể thêm nó vào tiêu đề của mình để dừng cảnh báo, nhưng tôi đang tự hỏi liệu có cách nào khác ngoài việc thêm nó vào tiêu đề (để tôi có thể giữ cho tiêu đề sạch và chuẩn) để ngăn cảnh báo không? Một pragma hay gì đó?


vâng, đôi khi bạn rơi vào cần phải nói với trình biên dịch không để cảnh báo bạn về bất kỳ biến không sử dụng (theo ông) nhưng trên thực tế bạn có thể sử dụng nó nhưBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

Câu trả lời:


145

Để tắt cảnh báo trên cơ sở từng tệp, sử dụng Xcode 3 và llvm-gcc-4.2, bạn có thể sử dụng:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Trong đó tên cảnh báo là một số cờ cảnh báo gcc.

Điều này sẽ ghi đè mọi cờ cảnh báo trên dòng lệnh. Nó không hoạt động với tất cả các cảnh báo. Thêm -fdiagnostics-show-option vào CFLAGS của bạn và bạn có thể xem bạn có thể sử dụng cờ nào để tắt cảnh báo đó.


Cảm ơn ! Chính xác những gì tôi cần!
Moszi

28
Cách dễ dàng để lấy mã cảnh báo: đi tới Trình điều hướng nhật ký (Command + 7), chọn bản dựng trên cùng, mở rộng nhật ký (nút '=' ở bên phải) và cuộn xuống dưới cùng.
Neal Ehardt

1
Đối với những người quan tâm, tham khảo giáo dục về các tùy chọn cảnh báo GCC: gcc.gnu.org/onlineocs/gcc/Warning-Options.html
Levi

2
Nó dường như #pragma GCC diagnostic ignored "-Wwarning-flag"được lấy ra đã
allenlinli

1
@allenlinli của nó vẫn ở đó, bạn chỉ cần thay thế warning-flagbằng một trong những cảnh báo được liệt kê trong gcc.gnu.org/onlineocs/gcc/Warning-Options.html
Fonix

49

có một cách đơn giản hơn để loại bỏ cảnh báo biến không được sử dụng :

#pragma unused(varname)

CHỈNH SỬA: nguồn: http://www.cocoadev.com/index.pl?XCodePragmas

CẬP NHẬT: Tôi đã thử nghiệm với một giải pháp mới, một giải pháp mạnh mẽ hơn

  1. Mở tab Dự án> Chỉnh sửa Mục tiêu Hoạt động> Xây dựng.
  2. Dưới User-Defined: tìm (hoặc tạo nếu bạn không tìm thấy) khóa: GCC_WARN_UNUSED_VARIABLEđặt nó thành NO.

EDIT-2 Ví dụ:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

trình biên dịch hiển thị cảnh báo biến không sử dụng cho ok.

Giải pháp:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PS: Bạn cũng có thể đặt / đặt lại cảnh báo khác GCC_WARN_ABOUT_RETURN_TYPE::YES/NO


31
Đơn giản hơn nữa là đặt __unused trước phần khai báo biến.
Mark Leonard

@ mark-leonard lẽ ra phải là một câu trả lời riêng biệt, tôi đã tìm kiếm điều này trong nhiều ngày. Tôi đã phải bắt đầu đọc các bình luận vì tuyệt vọng. Cảm ơn bạn.
Repose

35

Đối với gcc, bạn có thể sử dụng

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

Bạn có thể tìm hiểu về GCC pragma tại đây và để nhận mã cảnh báo của cảnh báo, hãy đi tới Bộ điều hướng báo cáo (Command + 9), chọn bản dựng trên cùng, mở rộng nhật ký (nút '=' ở bên phải) và cuộn đến dưới cùng và ở đó mã cảnh báo của bạn nằm trong dấu ngoặc vuông như thế này[-Wshadow-ivar]

Đối với tiếng kêu, bạn có thể sử dụng

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop

4
Clang hỗ trợ pragma của GCC để tương thích với mã nguồn hiện có. Vì vậy, bạn chỉ cần viết pragma định dạng gcc.
Allen

1
Bắt đầu với Xcode 5.0, Clang là trình biên dịch duy nhất được cung cấp. Vì vậy, bạn có thể muốn sử dụng định dạng clang pragma ngay bây giờ.
allenlinli

27

Để tăng cường cảnh báo cho một tệp riêng lẻ, hãy làm như sau:

chọn tệp trong dự án xcode. nhấn nhận thông tin đi đến trang với các tùy chọn xây dựng nhập -Không- để phủ nhận cảnh báo:

-Không-

ví dụ

-Không-không-sử-dụng-tham số

Bạn có thể nhận được tên của cảnh báo nếu bạn nhìn vào cài đặt dự án, xem các cảnh báo GCC nằm ở cuối trang tab xây dựng, bằng cách nhấp vào mỗi cảnh báo, nó sẽ cho bạn biết tên thông số cảnh báo:

ví dụ

Cảnh báo bất cứ khi nào một tham số hàm không được sử dụng ngoài phần khai báo của nó. [GCC_WARN_UNUSED_PARAMETER, -thông số không sử dụng]


2
Đây là một giải pháp tuyệt vời cho mã khi bạn đã bao gồm từ một codebase bạn không muốn thay đổi điều đó xảy ra để cảnh báo trình biên dịch kích hoạt ...
Đánh dấu Beaton

Có vẻ như một cách tuyệt vời, nhưng bất kỳ ý tưởng làm thế nào bạn làm điều này trong XCode 4
Santthosh

2
Đã tìm thấy giải pháp của tôi ở đây cho XCode 4 stackoverflow.com/questions/6057192/…
Santthosh

nếu bạn cần một cảnh báo supress chỉ cho một vấn đề, như của tôi: ...m:45:69: Incompatible pointer types sending...tôi đã mở giải thích về bản dựng và tìm thấy cảnh báo này: [-Wincompatible-pointer-types]tôi vừa đổi tên nó thành -Wno-incompatible-pointer-typesvà thêm làm cờ vào .mtệp của mình ... bùng nổ không còn cảnh báo nữa ... +10 nếu tôi có thể
Nicos Karalis

5

Với Objective-C, một số lỗi nghiêm trọng chỉ xuất hiện dưới dạng cảnh báo. Tôi không chỉ không bao giờ tắt cảnh báo, tôi thường bật "Coi cảnh báo là lỗi" (-Werror).

Mọi loại cảnh báo trong mã của bạn có thể tránh được bằng cách thực hiện mọi thứ một cách chính xác (thông thường bằng cách truyền các đối tượng đến đúng loại) hoặc bằng cách khai báo các nguyên mẫu khi bạn cần chúng.


14
Mặc dù đây là lời khuyên chung tốt, nhưng nó không trả lời câu hỏi. Không phải tất cả các cảnh báo đều quan trọng hoặc nghiêm trọng; nhiều cái khá tầm thường. Giả sử rằng một người được yêu cầu sử dụng thư viện của bên thứ ba và không thể sửa đổi nó, vì bất kỳ lý do gì (cơ sở mã kế thừa, mã được liên kết bởi bên thứ ba, quy định của ông chủ, v.v.) Việc loại bỏ các cảnh báo nhỏ cụ thể là khá chấp nhận được trong những trường hợp này.
Paul Legato

5

Để loại bỏ cảnh báo: hãy thử tạo giao diện danh mục cho đối tượng được đề cập

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

Là một sang một bên, tôi mạnh mẽ khuyên chống lại gọi phương pháp không có giấy tờ trong vận chuyển mã. Giao diện có thể và sẽ thay đổi, và đó sẽ là lỗi của bạn.


Tôi cũng làm điều này. Tôi gọi danh mục của mình là "Riêng tư" và đặt nó ở đầu tệp .m ... Nó phục vụ như một cách để chuyển tiếp khai báo các phương thức chỉ được sử dụng trong tệp. Tôi đồng ý rằng tệp tiêu đề riêng tư sẽ chuẩn hơn, nhưng việc phải liên tục trả lại giữa các tệp cho một thứ thực sự nên được chứa hoàn toàn (riêng tư) đối với việc triển khai là điều khó chịu.
Pat Niemeyer

Vì vậy, nó chỉ ra rằng bạn có thể sử dụng mẹo C cũ là chỉ thực hiện phương pháp trước khi bất kỳ thứ gì sử dụng nó. Sau đó, bạn đã có cho mình một phương thức tệp cục bộ. Tôi nghĩ rằng nó không phải là riêng tư, vì vậy các tệp khác có thể gửi tin nhắn đến bộ chọn mà bạn xác định theo cách này.
Mark Pauley


3

Tạo một tệp tiêu đề mới, riêng biệt có tên là 'Undocumented.h' và thêm nó vào dự án của bạn. Sau đó, tạo một khối giao diện cho mỗi lớp mà bạn muốn gọi các hàm không có giấy tờ và đặt cho mỗi lớp một danh mục '(Không có giấy tờ)'. Sau đó, chỉ cần đưa một tệp tiêu đề đó vào PCH của bạn. Bằng cách này, các tệp tiêu đề ban đầu của bạn vẫn sạch sẽ, chỉ có một tệp khác để duy trì và bạn có thể nhận xét một dòng trong PCH của mình để bật lại tất cả các cảnh báo một lần nữa.

Tôi cũng sử dụng phương pháp này cho các hàm được khấu hao trong 'Depreciated.h' với danh mục '(Đã khấu hao)'.

phần tốt nhất là bạn có thể bật / tắt các cảnh báo riêng lẻ một cách có chọn lọc bằng cách nhận xét hoặc bỏ chú thích các nguyên mẫu riêng lẻ.


1

Việc loại bỏ cảnh báo cụ thể đó là không an toàn. Trình biên dịch cần biết các loại đối số và trả về một phương thức để tạo mã chính xác.

Ví dụ: nếu bạn đang gọi một phương thức như thế này

[foo doSomethingWithFloat: 1.0];

có một float và không có nguyên mẫu nào được hiển thị, khi đó trình biên dịch sẽ đoán rằng phương thức này nhận một double, không phải một float. Điều này có thể gây ra sự cố và các giá trị được diễn giải không chính xác. Trong ví dụ trên, trên một máy endian nhỏ như máy intel, phương thức nhận sẽ thấy 0 được truyền chứ không phải 1.

Bạn có thể đọc lý do tại sao trong tài liệu ABI i386 hoặc bạn có thể chỉ sửa các cảnh báo của mình. :-)


2
Lời khuyên tốt, nhưng không thực sự trả lời câu hỏi, như trên.
Paul Legato
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.