2011-06-03 8 views
7

मैंने सोचा था कि NSAssertprintf विनिर्देशक का उपयोग नहीं कर सकता है, लेकिन यह:क्यों NSAssert1, आदि NSAssert के बजाय?

NSAssert(0, @"%@%@", @"foo", @"bar"); 

काम करता है बस के रूप में आप उम्मीद थी:

*** Assertion failure in -[MyClass myMethod], <Path>/MyClass.m:84 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
    reason: 'foobar' 

तो NSAssert1, NSAssert2, आदि का उपयोग करते समय NSAssert की बात क्या है काम करता है?

Xcode 4.0 और iOS 4.3 SDK के साथ यह है कि अगर मायने रखती है। (यदि ऐसा नहीं होता है, तो मैं टैग अपडेट करूंगा।)

उत्तर

17

NSAssert() के वर्तमान संस्करण प्रीप्रोसेसर वैरिएडिक मैक्रोज़ का उपयोग करते हैं, यानी __VA_ARGS__। चूंकि variadic मैक्रो किसी C99 विशेषता है, मेरा अनुमान है कि एसडीके के पुराने संस्करणों, NSAssert() में परिवर्तित युक्तियों की अनुमति नहीं दी इसलिए NSAssert1(), NSAssert2() के लिए की जरूरत है, आदि है

आप

NSAssert(0, @"%@%@", @"foo", @"bar"); 
संकलन करने का प्रयास करें कि कॉड के लिए

error: too many arguments provided to function-like macro invocation 
    NSAssert(0, @"%@%@", @"foo", @"bar"); 

:

-std=c89 या -ansi (आईएसओ C90, सी कि variadic मैक्रो का समर्थन नहीं करता के एक पुराने संस्करण) का उपयोग कर, आप एक संकलक त्रुटि मिलती है ई -std=c89 या -ansi साथ संकलित करने के लिए, आप NSAssert2() उपयोग करने की आवश्यकता:

NSAssert2(0, @"%@%@", @"foo", @"bar"); 
0

बहुत बढ़िया जवाब तक Bavarious।

बस इसे करने के लिए अपने एक बिट जोड़ने। लोग हैं, जो इस मुद्दे को Too many arguments provided to function-like macro invocation सामना कर रहे हैं के लिए। हिस्से के लिए वेतन ध्यान -std=c89 @Bavarious द्वारा के रूप में उल्लेख किया है।

यहाँ कैसे मैं इस मुद्दे से छुटकारा मिला है।

  1. जाओ सेटिंग्स के निर्माण के लिए -> एप्पल LLVM 6.1
  2. ढूँढें सी भाषा बोली
  3. -std=c99 को बदलें
संबंधित मुद्दे