programing

형식 인수로 사용할 때 NSInterger 변수를 길게 캐스트해야 하는 이유는 무엇입니까?

newnotes 2023. 4. 20. 22:40
반응형

형식 인수로 사용할 때 NSInterger 변수를 길게 캐스트해야 하는 이유는 무엇입니까?

NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <==== 

위의 코드는 다음 오류를 발생시킵니다.

'NSInterger' 형식의 값은 형식 인수로 사용할 수 없습니다. 대신 '긴'에 명시적 캐스트를 추가하십시오.

수정한NSLog메시지는 사실NSLog(@"%lg", (long) myInt);의 정수값을 변환해야 하는 이유는 무엇입니까?myInt로.long값을 표시하려면 어떻게 해야 하나요?

이 경고는 OS X(64비트)에서 컴파일할 때 발생합니다.그 플랫폼에서는NSInteger로 정의됩니다.long64비트 정수입니다.%i한편 포맷은int(32비트).따라서 형식과 실제 파라미터의 크기가 일치하지 않습니다.

부터NSInteger32비트 또는 64비트입니다.플랫폼에 따라서는 컴파일러는 캐스트를 추가할 것을 권장합니다.long일반적으로.

업데이트: iOS 7은 64비트도 지원하므로 iOS용 컴파일 시 동일한 경고를 받을 수 있습니다.

형식 지정자가 데이터 유형과 일치하는 경우 어떤 형식으로도 캐스팅할 필요가 없습니다.자세한 내용은 Martin R의 답변을 참조하십시오.NSInteger는 네이티브 타입으로 정의됩니다.

따라서 64비트 환경용으로 작성된 코드의 경우 다음과 같이 로그 문을 작성할 수 있습니다.

NSLog(@"%ld",  myInt); 

한편, 32비트 환경의 경우 다음을 쓸 수 있습니다.

NSLog(@"%d",  myInt); 

깁스 없이도 다 될 거야

캐스트를 사용하는 이유 중 하나는 좋은 코드가 플랫폼 간에 포팅되는 경향이 있기 때문에 변수를 명시적으로 캐스트하면 32비트와 64비트 모두에서 깔끔하게 컴파일됩니다.

NSLog(@"%ld",  (long)myInt);

이는 NSLog 스테이트먼트뿐만 아니라 디버깅 지원뿐 아니라[NSString stringWithFormat:]및 다양한 파생 메시지(생산 코드의 합법적인 요소)를 포함합니다.

NS Log에 NSInterger를 전달하는 대신 NS Number를 전달합니다.이렇게 하면 모든 캐스트를 둘러보고 올바른 문자열 형식 지정자를 선택할 수 있습니다.

NSNumber foo = @9000;
NSLog(@"foo: %@", foo);
NSInteger bar = 9001;
NSLog(@"bar: %@", @(bar));

NSIntegers에서도 안심하고 사용할 수 있습니다.64비트/32비트 혼합 환경에서 NSInterger NSInterger에 대한 답변을 참조하십시오.

사용 중 경고음이 계속 울립니다.NSLog(@"%ld", (long)myInt);에 대한 변경 선언 후 경고를 중지합니다.long myInt = 1804809223;iOS 10에서 사용할 수 있습니다.

OS X 에서는, 다음의 몇개의 데이터 타입은 다음과 같습니다.NSInterger, NSUIInterger, CGFloat 및 CFIndex: 32비트 및 64비트 환경에서 일관된 값 표현 수단을 제공합니다.32비트 환경에서는 NSInterger 및 NSUIInterger는 각각 int 및 unsigned int로 정의됩니다.64비트 환경에서는 NSInterger와 NSUIInterger는 각각 long 및 unsigned long으로 정의됩니다.플랫폼에 따라 다른 printf 스타일 지정자를 사용할 필요가 없도록 32비트 환경과 64비트 환경 모두에서 이 링크에 표시된 지정자를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/16075559/why-does-an-nsinteger-variable-have-to-be-cast-to-long-when-used-as-a-format-arg

반응형