A NSInteger
tiene 32 bits en plataformas de 32 bits y 64 bits en plataformas de 64 bits. ¿Hay un NSLog
especificador 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
encendido
Eso me está causando 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 %d
especificador. Pero si uso el %d
especificador, recibo una advertencia al compilar para 64 bits sugiriendo que use %ld
en su lugar.
Si uso %ld
para que coincida con el tamaño de 64 bits, cuando compilo para el código de 32 bits recibo una advertencia que sugiere que use %d
en su lugar.
¿Cómo soluciono ambas advertencias a la vez? ¿Hay algún especificador que pueda usar que funcione?
Esto también impacta [NSString stringWithFormat:]
y [[NSString alloc] initWithFormat:]
.
static inline NSIntToLong(NSInteger i) {return (long)i;}
. Esto evita deshabilitar la comprobación de tipo por completo (es decir, si el tipo de i cambia).