A NSInteger
32-बिट प्लेटफॉर्म पर 32 बिट्स और 64-बिट प्लेटफॉर्म पर 64 बिट्स है। क्या कोई ऐसा NSLog
विनिर्देशक है जो हमेशा के आकार से मेल खाता है NSInteger
?
सेट अप
- Xcode 3.2.5
- llvm 1.6 संकलक (यह महत्वपूर्ण है; gcc ऐसा नहीं करता है)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
कामोत्तेजित
मुझे यहाँ कुछ दुःख हो रहा है:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
32 बिट कोड के लिए, मुझे %d
विनिर्देशक की आवश्यकता है । लेकिन अगर मैं %d
विनिर्देशक का उपयोग करता हूं, तो मुझे 64 बिट के लिए संकलन करते समय चेतावनी दी जाती है कि मैं %ld
इसके बजाय उपयोग करता हूं ।
यदि मैं %ld
64 बिट आकार से मेल खाने के लिए उपयोग करता हूं , तो 32 बिट कोड के लिए संकलन करने पर मुझे चेतावनी मिलती है कि मैं %d
इसके बजाय उपयोग करने का सुझाव देता हूं ।
मैं एक बार में दोनों चेतावनियाँ कैसे ठीक करूँ? क्या कोई स्पेसिफ़ायर है जो मैं या तो काम करता है?
यह भी प्रभाव डालता है [NSString stringWithFormat:]
और [[NSString alloc] initWithFormat:]
।
static inline NSIntToLong(NSInteger i) {return (long)i;}
। यह पूरी तरह से जाँच को अक्षम करने से बचता है (अर्थात यदि मैं बदल जाता है)।