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;}แต่ผมคิดว่าผมอาจจะใช้ วิธีนี้จะหลีกเลี่ยงการปิดใช้งานการตรวจสอบประเภทโดยสิ้นเชิง (เช่นหากประเภทของ i เปลี่ยนไป)