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
대신.
사용하는 경우%ld
64비트 사이즈에 맞추기 위해 32비트 코드를 컴파일할 때 경고 메시지가 나타납니다.%d
대신.
두 경고를 한 번에 수정하려면 어떻게 해야 합니까?사용할 수 있는 사양이 있습니까?
또, 이것에 의해서도[NSString stringWithFormat:]
그리고.[[NSString alloc] initWithFormat:]
.
갱신된 답변:
를 사용할 수 있습니다.z
그리고.t
처리할 수식어NSInteger
그리고.NSUInteger
모든 아키텍처에서 경고 없이 사용할 수 있습니다.
사용하고 싶다%zd
서명된 경우,%tu
서명되지 않은 경우%tx
16진수일 경우.
원답:
공식적으로 권장되는 접근법은%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
'programing' 카테고리의 다른 글
반환 값을 사용하여 스토어드 프로시저를 호출합니다. (0) | 2023.04.13 |
---|---|
PowerShell 복사 스크립트에서 여러 문자열을 적절하게 필터링하는 방법 (0) | 2023.04.13 |
Ruby에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법 (0) | 2023.04.13 |
SQL Server 데이터베이스로 Excel 스프레드시트 열 가져오기 (0) | 2023.04.13 |
SQL Server ORDER BY 날짜 및 Null 마지막 (0) | 2023.04.13 |