A NSInteger
é de 32 bits em plataformas de 32 bits e 64 bits em plataformas de 64 bits. Existe um NSLog
especificador que sempre corresponde ao tamanho de NSInteger
?
Configuração
- Xcode 3.2.5
- compilador llvm 1.6 (isso é importante; o gcc não faz isso)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
ligadas
Isso está me causando um pouco de tristeza aqui:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Para código de 32 bits, preciso do %d
especificador. Mas se eu usar o %d
especificador, recebo um aviso ao compilar para 64 bits, sugerindo que eu o use %ld
.
Se eu usar %ld
o tamanho de 64 bits, ao compilar o código de 32 bits, recebo um aviso sugerindo que o use %d
.
Como faço para corrigir os dois avisos de uma só vez? Existe um especificador que eu possa usar que funcione também?
Isso também afeta [NSString stringWithFormat:]
e [[NSString alloc] initWithFormat:]
.
static inline NSIntToLong(NSInteger i) {return (long)i;}
. Isso evita desativar completamente a verificação de tipo (ou seja, se o tipo de i for alterado).