objective-c cocoa 32bit-64bit nslog nsinteger

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 .