objective c - Especificador NSLog/printf para NSInteger?
objective-c cocoa (2)
Un NSInteger
es de 32 bits en plataformas de 32 bits y 64 bits en plataformas de 64 bits. ¿Hay un especificador NSLog
que siempre coincida con el tamaño de NSInteger
?
Preparar
- Xcode 3.2.5
- compilador llvm 1.6 (esto es importante; gcc no hace esto)
-
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
activado
Eso me está causando algo de dolor aquí:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Para el código de 32 bits, necesito el especificador %d
. Pero si utilizo el especificador %d
, aparece una advertencia al compilar durante 64 bits sugiriendo que use %ld
lugar.
Si utilizo %ld
para que coincida con el tamaño de 64 bits, al compilar el código de 32 bits aparece una advertencia sugiriendo que use %d
lugar.
¿Cómo corrijo ambas advertencias a la vez? ¿Existe un especificador que pueda usar que funcione en cualquiera de los dos?
Esto también afecta a [NSString stringWithFormat:]
y [[NSString alloc] initWithFormat:]
.
Los formateadores vienen de la función de impresión UNIX / POSIX estándar. Use % lu para unsigned long ,% ld para long,% lld para long long y % llu para unsigned long long . Pruebe man printf en la consola, pero en Mac está incompleto. Las páginas de manual de linux son más explícitas http://www.manpages.info/linux/sprintf.3.html
Ambas advertencias solo pueden ser corregidas por NSLog (@ "% lu", (unsigned long) arg); combinado con un reparto ya que el código se compilará en 32 y 64 bits para iOS. De lo contrario, cada compilación crea una advertencia por separado.
Respuesta actualizada:
Con Xcode actual, puede usar los modificadores z
y t
para manejar NSInteger
y NSUInteger
sin advertencias, en todas las arquitecturas.
Desea utilizar %zd
para firmar, %tu
para unsigned y %tx
para hex.
Esta información es cortesía de Greg Parker .
Respuesta original:
El enfoque oficial recomendado es usar %ld
como su especificador, y lanzar el argumento real a un long
.