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 เปลี่ยนไป)