Xcode에서 "사용하지 않는 변수"경고를 어떻게 제거 할 수 있습니까?


98

사용하지 않는 변수 경고가 발생하는 이유를 정확히 이해합니다. 대부분의 경우 매우 유용하기 때문에 일반적으로 억제하고 싶지 않습니다. 그러나 다음 (기인 된) 코드를 고려하십시오.

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

Xcode saved는 사용되지 않는 변수를 보고합니다 . 나는 이것이 NSAssert1매크로 이기 때문이라고 생각합니다 . NS_BLOCK_ASSERTIONS매크로되어 있지 목적 C의 주장은 확실히 활성화되도록 정의.

아무것도 아프지 않지만 어수선하고 짜증나는 것을 발견하고 억제하고 싶지만 어떻게 해야할지 모르겠습니다. 변수를 자체에 할당하면 컴파일러 경고가 제거되지만 그러한 것이 존재하는 경우 "올바른"방식으로 수행하는 것이 좋습니다.

답변:


107

새 LLVM 컴파일러에서 여전히 지원되는지 확실하지 않지만 GCC에는 해당 경고를 억제하는 데 사용할 수있는 "unused"속성이 있습니다.

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

또는 (LLVM이 위의 내용을 지원하지 않는 경우), 변수 선언을 별도의 줄로 분할하여 매크로 확장 여부에 관계없이 변수가 "사용"되도록 할 수 있습니다.

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

107

Xcode 4.3.2를 사용하고 이것이 작동하는 것 같다는 것을 발견했습니다 (작은 쓰기).

BOOL saved __unused;

이것은 내가 그 경고를 얻을, 나를 위해 작동하지 않습니다'saved' was marked as unused but was used
히스 테두리

37

Xcode에서 "사용하지 않는 변수"에 대한 경고를 설정할 수 있습니다. 대상에 대한 "Build Settings"로 이동하고 "unused"라는 단어로 필터링합니다.

다음은 스크린 샷입니다. Builld 설정 스크린 샷

디버그 용으로 만 변경하는 것이 좋습니다. 그렇게하면 릴리스 버전에서 어떤 것도 놓치지 않습니다.


37
그레고리가 "대부분의 경우 매우 유용하기 때문에 일반적으로이를 억제하고 싶지 않습니다"라고 말한 질문의 일부를 놓쳤습니까?
Sherm Pendley 2011 년

8
@ShermPendley 그럼에도 불구하고 이것은 여전히 ​​유용하며 전 세계적으로 끄는 방법에 대한 내 질문에 답했습니다.
raffian 2012-09-23

9
경고를 끄는 것은 버그를 놓칠 수있는 좋은 방법입니다. 나는 적극 권장합니다.
orion elenzil 2013 년

2
@orionelenzil-예, 아니오. 오 탐지에는 실제 인터페이스 문제가 있습니다. 변수를 사용하는 코드 부분에 도달하지 않은 경우 코드를 작성하는 동안 경고가 계속 나타납니다. 시간이 지남에 따라 경고를 무시하도록 훈련시켜 더 중요한 오류를 놓칠 수 있습니다. 능동적으로 편집되는 코드 블록의 오류를 억제 할 수있는 것이 좋습니다.
TechZen 2014 년

안녕하세요, NO를 설정하면 잘 작동합니다. 그러나 내 의심은 : 나는 디버그 및 릴리스 NO를 설정해야합니다. 사용되지 않는 변수 : NO? 어느 것을 설정해야합니다. 완전히 NO로 설정하면 릴리스 na 중에 문제가 발생하지 않습니까?
SR Nayak

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

이렇게 해보세요. 그것은 나를 위해 일하고 있습니다. 그것은 당신에게도 효과가 있습니다.


이것은 내가 그 경고를 얻을, 나를 위해 작동하지 않습니다'saved' was marked as unused but was used
히스 테두리

15

변수를 사용 된 것으로 표시하는 유일한 간단하고 이식 가능한 방법은 사용하는 것입니다.

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

하지만 이미 설명한 컴파일러 관련 확장에 만족할 수도 있습니다.


2
나는 위에서 설명한 추악한 #pragma보다 이것을 선호합니다.
Northernman

1
안녕하세요, 좋은 팁
dimazava

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

출처


그것은 그 #pragmas 사이에만 경고하지 않습니다 때문에 이것은 가장 깨끗한 방법입니다
cornr


5

"Release"에서 " No" LLVM compliler 2.0 경고 를 설정할 수 있습니다.여기에 이미지 설명 입력


4

이것이 C에서 수행하는 방식이므로 Objective-C도 마찬가지입니다.

경고를 활성화하지 않았더라도 항상 반환 값을 명시 적으로 무시 된 것으로 표시하는 것이 좋습니다. 또한 다른 개발자에게 반환 값을 잊은 것이 아니라 실제로 무시하도록 명시 적으로 선택했음을 보여줍니다.

(void)[moc save:&error];

편집 : 컴파일러는에 대한 캐스트를 무시 void하므로 성능에 영향을주지 않아야합니다. 깔끔한 인간 주석 일뿐입니다.


특정 컨텍스트에서 컴파일 할 Objective-C 코드를 얻으려면이 해킹을 사용해야합니다. 사용하는 (void)것이 가장 확실한 방법입니다. 감사합니다!
Dan Rosenstark

1

두 줄로 구성하십시오. 선언과 기본값 분리

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.