A NSIntegeré de 32 bits em plataformas de 32 bits e 64 bits em plataformas de 64 bits. Existe um NSLogespecificador 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_PRINTFligadas
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 %despecificador. Mas se eu usar o %despecificador, recebo um aviso ao compilar para 64 bits, sugerindo que eu o use %ld.
Se eu usar %ldo 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).