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.