Xcode에서 경고를 억제하는 방법이 있습니까?


119

Xcode에서 경고를 억제하는 방법이 있습니까?

예를 들어 문서화되지 않은 메서드를 호출하고 있으며 메서드가 헤더에 없기 때문에 컴파일시 경고가 표시됩니다. 경고를 중지하기 위해 헤더에 추가 할 수 있다는 것을 알고 있지만, 경고를 억제하기 위해 헤더에 추가하는 것 외에 다른 방법이 있는지 궁금합니다 (헤더를 깨끗하고 표준으로 유지할 수 있음)? 프라 그마 같은 거요?


예, 때로는 사용하지 않는 변수 (그에 따르면)에 대해 경고하지 않기 위해 컴파일러에 말할 필요가 있지만 실제로는 다음과 같이 사용할 수 있습니다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

답변:


145

Xcode 3 및 llvm-gcc-4.2를 사용하여 파일별로 경고를 비활성화하려면 다음을 사용할 수 있습니다.

#pragma GCC diagnostic ignored "-Wwarning-flag"

경고 이름은 gcc 경고 플래그입니다.

이것은 명령 줄의 모든 경고 플래그를 재정의합니다. 그래도 모든 경고와 함께 작동하지는 않습니다. CFLAGS에 -fdiagnostics-show-option을 추가하면 해당 경고를 비활성화하는 데 사용할 수있는 플래그를 확인할 수 있습니다.


감사 ! 정확히 내가 필요한 것!
— Moszi

28
경고 코드를 얻는 쉬운 방법 : 로그 탐색기 (Command + 7)로 이동하여 최상위 빌드를 선택하고 로그 (오른쪽의 '='버튼)를 확장 한 다음 하단으로 스크롤합니다.
— Neal Ehardt

1
관심있는 사람들을 위해 GCC 경고 옵션에 대한 교육적 참조 : gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
— Levi

2
그것은 보인다 #pragma GCC diagnostic ignored "-Wwarning-flag"이미 제거
— allenlinli

1
@allenlinli는 아직 거기에 있습니다 warning-flag. gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
— Fonix

49

사용하지 않는 변수 경고 를 억제하는 더 간단한 방법이 있습니다 .

#pragma unused(varname)

편집 : 출처 : http://www.cocoadev.com/index.pl?XCodePragmas

업데이트 : 나는 새로운 솔루션, 더 강력한 솔루션을 찾았습니다.

  1. 프로젝트> 활성 대상 편집> 빌드 탭을 엽니 다.
  2. 아래 User-Defined: 찾기 (또는 찾을 수없는 경우 생성) 키 :로 GCC_WARN_UNUSED_VARIABLE설정합니다 NO.

EDIT-2 예 :

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

컴파일러는에 대해 사용되지 않은 변수 경고를 표시합니다 ok.

해결책:

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

추신 : 다른 경고를 설정 / 재설정 할 수도 있습니다. GCC_WARN_ABOUT_RETURN_TYPE:YES/NO


31
더 간단한 방법은 변수 선언 앞에 __unused를 넣는 것입니다.
— Mark Leonard

@ mark-leonard는 별도의 답변이어야했으며 며칠 동안 이것을 찾고있었습니다. 필사적으로 댓글을 읽기 시작해야했다. 감사합니다.
— 휴식

35

gcc의 경우 다음을 사용할 수 있습니다.

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

여기에서 GCC pragma에 대해 알아볼 수 있으며 경고의 경고 코드를 얻으려면 Report Navigator (Command + 9)로 이동하여 최상위 빌드를 선택하고 로그를 확장 한 다음 (오른쪽의 '='버튼) 아래쪽에 경고 코드가 다음과 같이 대괄호 안에 있습니다.[-Wshadow-ivar]

clang의 경우 사용할 수 있습니다.

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

4
Clang은 기존 소스 코드와의 호환성을 위해 GCC의 pragma를 지원합니다. 따라서 gcc 형식 pragma 만 작성하면됩니다.
— Allen

1
Xcode 5.0부터 Clang이 제공되는 유일한 컴파일러였습니다. 따라서 지금 clang 형식 pragma를 사용하는 것이 좋습니다.
— allenlinli

27

개별 파일에 대한 경고를 표시하지 않으려면 다음을 수행하십시오.

xcode 프로젝트에서 파일을 선택하십시오. 정보 가져 오기를 눌러 빌드 옵션이있는 페이지로 이동하고 -Wno-를 입력하여 경고를 무효화합니다.

-아니-

예 :

-Wno-unused-parameter

프로젝트 설정에서 빌드 탭 페이지 하단에있는 GCC 경고를 보면 경고 이름을 알 수 있습니다. 각 경고를 클릭하면 경고 매개 변수 이름이 표시됩니다.

예 :

함수 매개 변수가 선언과 별도로 사용되지 않을 때마다 경고합니다. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]


2
이 ... 당신이 트리거 컴파일러 경고에 어떻게 수정하지 않는 코드베이스에서 당신이 포함 한 코드에 대한 훌륭한 솔루션입니다
— 마크 Beaton

좋은 방법처럼 보인다,하지만 당신은 엑스 코드 4에서이 작업을 수행하는 방법을 어떤 아이디어
— Santthosh

2
XCode 4에 대한 내 솔루션을 찾았습니다. stackoverflow.com/questions/6057192/…
— Santthosh

내 문제와 같이 한 가지 문제에 대해서만 경고가 필요한 경우 : ...m:45:69: Incompatible pointer types sending...빌드 설명을 열고이 경고를 찾았습니다. [-Wincompatible-pointer-types]방금 이름을 바꾸고 -Wno-incompatible-pointer-types내 .m파일에 플래그로 추가했습니다 ... 붐 더 이상 경고 없음 ... +10 if 내가 할 수있는
— 니 코스 Karalis

5

Objective-C를 사용하면 많은 심각한 오류가 경고로만 나타납니다. 경고를 비활성화 하지 않을 뿐만 아니라 일반적으로 "경고를 오류로 처리"(-Werror)를 설정합니다.

코드의 모든 유형의 경고는 작업을 올바르게 수행하거나 (일반적으로 객체를 올바른 유형으로 캐스팅하여) 필요할 때 프로토 타입을 선언하여 방지 할 수 있습니다.


14
이것은 좋은 일반적인 조언이지만 질문에 대한 답은 아닙니다. 모든 경고가 중요하거나 심각한 것은 아닙니다. 많은 사람들이 아주 사소합니다. 제 3 자 라이브러리를 사용해야하고 어떤 이유로 든 수정할 수 없다고 가정합니다 (레거시 코드베이스, 제 3 자에 의해 연결되는 코드, 상사 규정 등). 이러한 경우 특정 사소한 경고를 억제하는 것은 상당히 허용됩니다.
— Paul Legato

5

경고를 없애려면 : 해당 개체에 대한 범주 인터페이스를 만들어보십시오.

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

여담으로, 나는 강력하게 코드를 운송에 문서화되지 않은 메소드를 호출에 대해 조언한다. 인터페이스는 변경 될 수 있으며 변경 될 수 있으며 이는 귀하의 잘못입니다.


나도 이렇게합니다. 내 카테고리를 "Private"라고 부르고 .m 파일의 맨 위에 둡니다. 파일 내에서만 사용되는 메서드를 전달하는 방법으로 사용됩니다. 개인 헤더 파일이 더 표준 적이라는 데 동의하지만 구현에 완전히 포함되어야하는 (비공개) 파일간에 지속적으로 바운스해야하는 것은 성가신 일입니다.
— Pat Niemeyer

따라서 어떤 것이 든 사용하기 전에 메소드를 구현하는 이전 C 트릭을 사용할 수 있습니다. 그런 다음 파일 로컬 방법이 있습니다. 나는 그것이 비공개가 아니라고 생각하므로 다른 파일이 이런 식으로 정의한 선택기에 메시지를 보낼 수 있습니다.
— Mark Pauley


3

'Undocumented.h'라는 별도의 새 헤더 파일을 만들고 프로젝트에 추가합니다. 그런 다음 문서화되지 않은 함수를 호출하려는 각 클래스에 대해 하나의 인터페이스 블록을 만들고 각각에 '(문서화되지 않음)'범주를 지정하십시오. 그런 다음 PCH에 하나의 헤더 파일을 포함하십시오. 이렇게하면 원래 헤더 파일이 깨끗하게 유지되고 유지 관리 할 파일이 하나 뿐이며 PCH에서 한 줄을 주석 처리하여 모든 경고를 다시 활성화 할 수 있습니다.

또한 '(감가 상각)'카테고리의 'Depreciated.h'에서 감가 상각 된 함수에도이 방법을 사용합니다.

가장 좋은 점은 개별 프로토 타입에 주석을 달거나 주석을 제거하여 개별 경고를 선택적으로 활성화 / 비활성화 할 수 있다는 것입니다.


1

특정 경고를 억제하는 것은 안전하지 않습니다. 컴파일러는 인수의 유형을 알아야하며 올바른 코드를 생성하기 위해 메소드로 리턴해야합니다.

예를 들어 다음과 같은 메서드를 호출하는 경우

[foo doSomethingWithFloat : 1.0];

플로트를 취하고 프로토 타입이 보이지 않으면 컴파일러는 메서드가 플로트가 아닌 double을 취한다고 추측합니다. 이로 인해 충돌이 발생하고 값이 잘못 해석 될 수 있습니다. 위의 예에서 인텔 머신과 같은 리틀 엔디안 머신에서 수신자 메소드는 1이 아닌 0이 전달 된 것으로 간주합니다.

i386 ABI 문서 에서 이유를 읽 거나 경고를 수정할 수 있습니다. :-)


2
좋은 조언이지만 위의 질문에 실제로 대답하지는 않습니다.
— Paul Legato
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.