3

Я только что провел некоторое время выяснить, почему изменяемый набор не правильно пересекаться себя с другим набором, используяСтранное поведение предупреждения -Wunused-значения

[someMutableSet intersectsSet:anotherSet]; // not the best idea 

Конечно, правильный синтаксис [someMutableSet intersectSet:anotherSet] и приведенная выше строка означает что-то другое - это вызов метода с возвращаемым значением BOOL.

Поскольку у меня есть опции -Wall -Wextra, это должно быть поймано как предупреждение. Но он не был пойман. Я исследовал дальше, пытаясь, где types является NSMutableSet:

(void)[types intersectsSet:types]; // -> no warning, this is expected 

    (BOOL)[types intersectsSet:types]; // (1) -> warning, this is expected 

И, опять же, если я это сделать:

[types intersectsSet:types]; // (2) -> no warning, UNEXPECTED 

нет никакого предупреждения, даже думал, что метод определяется как - (BOOL)intersectsSet:(NSSet *)otherSet; так один (1) и (2) будут эквивалентны. Может быть, подлый инструмент компиляции считает (1) более опасным по сравнению с (2), но почему это влияет на предупреждения, спрашиваю я?

Итак, как сделать компилятор таким же предупреждением в (2), как в (1)?

+0

Компилятор 'Яблоко LLVM версии 5.0 (лязг-500.2.79) (на основе LLVM 3.3svn)' (текущий Xcode, то есть) –

+0

Какое предупреждение в (1) вы видите? Я склоняюсь к утверждению, что компилятор не беспокоится о неиспользуемом типе возвращаемого значения по умолчанию, если вы явно его не выбрали. – Jessedc

ответ

2

Такое поведение в компиляторе кажется намеренным (и разумно.)

Если -Wunused-value предупреждение было выброшено для всех сообщений ObjC отправить выражения, где метод имеет возвращаемое значение, которое неявно отбрасывается (т.е. нет пустот литая ,) это было бы так «болтливо», что это сделало бы себя бесполезным. Другими словами, люди получат такое большое количество предупреждений для существующих проектов, что они просто отключили бы предупреждение, вместо того, чтобы комментировать все такие случаи с помощью (void) призов.

Тот факт, что предупреждение является испускается в том случае, когда возвращаемое значение отливают в BOOL это приятный сюрприз, и имеет смысл: это разумно для компилятора, то предположит, что программист действительно заинтересован в возвращении (потому что почему другие включают литье?)

Сообщество разработчиков Clang на cfe-dev mailing list может предоставить вам больше информации о мышлении, стоящем за этим.

Я не знаю никоим образом, чтобы заставить поведение, которое вы хотите в целом, но для интерфейсов в своем собственном коде вы можете заставить это предупреждение использовать атрибут warn_unused_result в объявлении метода ObjC (или функции C):

@interface MyClass : NSObject 
- (int) myReturnValueMustNotBeIgnored __attribute__((warn_unused_result)); 
@end 
+0

Спасибо! Хорошо слышать об этом атрибуте. Я пытаюсь быть явным в отказе от результата, так как это часто бывает ошибкой (например, «[NSArray sortedArrayUsingSelector:]», где я имел в виду разметку на месте), но я понимаю суть существующей базы кода. –

Смежные вопросы