programing

NSInterger의 NSLog/printf 지정자?

topblog 2023. 4. 13. 20:29
반응형

NSInterger의 NSLog/printf 지정자?

A NSInteger는 32비트 플랫폼에서는 32비트, 64비트 플랫폼에서는 64비트입니다.이 있나요?NSLog항상 사이즈에 일치하는 지정자NSInteger?

세우다

  • X코드 3.2.5
  • llvm 1.6 컴파일러 (이것은 중요합니다.gcc는 이 기능을 하지 않습니다)
  • GCC_WARN_TYPECHECK_CALLS_TO_PRINTF켜졌다

그것 때문에 슬퍼하고 있어요

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSInteger i = 0;
        NSLog(@"%d", i);
    }
    return 0;
}

32비트 코드의 경우,%d지정자.하지만 만약 내가%d지정자, 64비트를 컴파일할 때 경고 메시지가 나타납니다.%ld대신.

사용하는 경우%ld64비트 사이즈에 맞추기 위해 32비트 코드를 컴파일할 때 경고 메시지가 나타납니다.%d대신.

두 경고를 한 번에 수정하려면 어떻게 해야 합니까?사용할 수 있는 사양이 있습니까?

또, 이것에 의해서도[NSString stringWithFormat:]그리고.[[NSString alloc] initWithFormat:].

갱신된 답변:

를 사용할 수 있습니다.z그리고.t처리할 수식어NSInteger그리고.NSUInteger모든 아키텍처에서 경고 없이 사용할 수 있습니다.

사용하고 싶다%zd서명된 경우,%tu서명되지 않은 경우%tx16진수일 경우.

이 정보는 그렉 파커가 제공한 것입니다.


원답:

공식적으로 권장되는 접근법은%ld당신의 지정자로서, 그리고 실제 인수를 에 던집니다.long.

인정된 답변은 전적으로 타당하고 표준 적합하며 정확합니다.유일한 문제는 그것이 더 이상 작동하지 않는다는 것인데, 이것은 완전히 애플의 잘못이다.

%zd 형식은 size_t 및 ssize_t의 C/C++ 표준 형식입니다.NSInterger 및 NSUIInterger와 마찬가지로 size_t 및 ssize_t는 32비트 시스템에서는 32비트, 64비트 시스템에서는 64비트입니다.그래서 %zd를 사용하여 NSInteger와 NSInteger를 인쇄했습니다.

단, NSInteger와 NSInteger는 64비트 시스템에서는 "긴"으로 정의되며 32비트 시스템에서는 "int"로 정의됩니다(64비트 대 32비트).현재 size_t는 모든 시스템에서 "long"으로 정의되어 있습니다.이것은 NSInterger(64비트 또는 32비트)와 크기는 같지만 유형은 다릅니다.Apple의 경고가 변경되었거나(따라서 올바른 비트 수를 가지고 있어도 잘못된 유형을 printf로 전달할 수 없습니다), size_t 및 ssize_t의 기본 유형이 변경되었습니다.어느 쪽인지는 모르겠지만 %zd가 얼마 전에 작동을 중지했습니다.현재 32비트 시스템과 64비트 시스템 모두에서 경고 없이 NSInterger를 인쇄하는 포맷은 없습니다.

유감스럽게도 할 수 있는 일은 다음과 같습니다.%ld를 사용하여 NSInterger에서 long으로 또는 NSInterger에서 unsigned long으로 값을 캐스팅합니다.

32비트를 빌드하지 않으면 캐스트 없이 %ld만 사용할 수 있습니다.

포메터는 표준 UNIX/POSIX printf 함수에서 제공됩니다.부호 없는 긴 경우 %lu, 긴 경우 %ld, 긴 경우 %lld, 긴 경우 %llu사용합니다.콘솔에서 man printf를 시도하지만 Mac에서는 불완전합니다.Linux의 manpages는 보다 명확한 http://www.manpages.info/linux/sprintf.3.html

두 경고 모두 NSLog(@"%lu", (부호가 없는 긴)arg)로만 수정할 수 있습니다. 코드가 32비트 및 iOS용 64비트로 컴파일되므로 캐스트와 결합할 수 있습니다.그렇지 않으면 컴파일할 때마다 별도의 경고가 생성됩니다.

언급URL : https://stackoverflow.com/questions/4405006/nslog-printf-specifier-for-nsinteger

반응형