Xcode में प्रीप्रोसेसर प्रतीक कैसे परिभाषित करें


100

क्या Xcode प्रोजेक्ट में प्रॉपर्टीज़ सेट करके सशर्त संकलन के लिए एक प्रतीक स्थापित करना संभव है?

मेरा उद्देश्य एक ऐसा प्रतीक बनाना है, जो सभी फाइलों के लिए उपलब्ध है, बिना आयात / शामिल किए, ताकि आम वर्गों के एक सेट का कुछ परियोजनाओं में एक विशेष व्यवहार हो सके। निम्नलिखित की तरह, लेकिन मेरे अपने प्रतीकों के साथ।

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

संबंधित: "
एक्सप्रो

जवाबों:


116

अपने लक्ष्य या प्रोजेक्ट सेटिंग्स पर जाएं, नीचे बाईं ओर स्थित गियर आइकन पर क्लिक करें, और "उपयोगकर्ता-परिभाषित सेटिंग जोड़ें" चुनें। नया सेटिंग नाम होना चाहिए GCC_PREPROCESSOR_DEFINITIONS, और आप दाएं हाथ के क्षेत्र में अपनी परिभाषाएं लिख सकते हैं।

Steph की टिप्पणियों के अनुसार, पूर्ण वाक्यविन्यास है:

constant_1=VALUE constant_2=VALUE

ध्यान दें कि अगर आपको किसी प्रतीक को #define करना है तो आपको '=' की जरूरत नहीं है , बजाय इसके कि आप उसे मूल्य दें ( #ifdefबयानों के लिए)


2
धन्यवाद! जो कोई भी रुचि रखता है, वाक्यविन्यास "kVarOne = 5 myVar = 3.0" (उद्धरण चिह्नों के बिना) की तरह दिखता है, मुझे यह परीक्षण और त्रुटि से मिला। क्या आप यह निर्दिष्ट करने के लिए अपना उत्तर संपादित कर सकते हैं? एक बार फिर धन्यवाद।
स्टीफ थिरियन

1
अद्भुत जवाब। मैं अभी भी इस वजह से बाल है। धन्यवाद धन्यवाद धन्यवाद। +1 (मेरी इच्छा है कि यह अधिक हो)
अली पर्र

11
FYI करें, Xcode 3.2.4 के रूप में, GCC_PREPROCESSOR_DEFINITIONS के लिए "प्रीप्रोसेसर मैक्रोज़" मैप्स, और Xcode आपको अब (अब यह पहले से ही उपलब्ध है) से कोई भी यूज़र-डिफ़ाइंड नहीं होने देगा।
क्ले ब्रिजेज

11
यह अब निचले बाएँ पर गियर आइकन नहीं है, बल्कि निचले दाईं ओर प्लस आइकन (आपके लक्ष्य की बिल्ड सेटिंग टैब) है।
जेसी स्मिथ

1
आपको इस प्रतिक्रिया को अपडेट करना चाहिए। अब कोई गियर आइकन नहीं है
राडु सिमियोनेस्कु

86

आपको उपयोगकर्ता-निर्धारित सेटिंग बनाने की आवश्यकता नहीं है। अंतर्निहित सेटिंग "प्रीप्रोसेसर मैक्रोज़" ठीक काम करता है। alt text http://idisk.mac.com/cdespinosa/Public/Picture%204.png

यदि आपके पास एक ही उपसर्ग फ़ाइल का उपयोग करने वाले कई लक्ष्य या परियोजनाएं हैं, तो इसके बजाय Precompiled Headers में Preprocessor Macros Not Used In Use का उपयोग करें, इसलिए आपकी मैक्रो परिभाषा में अंतर किसी पूर्व-स्थापित हेडर के अनावश्यक अतिरिक्त सेट को ट्रिगर नहीं करते हैं।


1
यदि यह अनुभाग बिल्ड सेटिंग्स से गायब है तो आप क्या करते हैं?
21:39 पर केविन लाईट

3
बेन गोटलिब सुझाव देते हैं। लेकिन Xcode के संस्करण 3.2.4 के रूप में, GCC_PREPROCESSOR_DEFINITIONS में "प्रीप्रोसेसर मैक्रोज़" नक्शे। आप पहले से उपलब्ध कुछ को उपयोगकर्ता-परिभाषित नहीं कर सकते।
क्ले ब्रिजेज

41

एक परिशिष्ट के रूप में, यदि आप अपने लक्ष्य में तार को परिभाषित करने के लिए इस तकनीक का उपयोग कर रहे हैं, तो यह है कि मुझे उन्हें कैसे परिभाषित और उपयोग करना था:

बिल्ड सेटिंग्स में -> प्रीप्रोसेसर मैक्रोज़, और हाँ बैकस्लैश परिभाषा में महत्वपूर्ण हैं:

APPURL_NSString=\@\"www.foobar.org\"

और स्रोत कोड में:

objectManager.client.baseURL = APPURL_NSString;

इस समाधान के लिए धन्यवाद, कुछ इस तरह से खोज रहा है, फिर भी स्टैक ओवरफ्लो जटिल समाधानों से भरा है।
डेविड पी

5

*_Prefix.pchप्रोजेक्ट वाइड मैक्रोज़ घोषित करने के लिए आप फ़ाइल का उपयोग कर सकते हैं । वह फ़ाइल आमतौर पर आप अन्य स्रोतों के समूह में होती है।


3

यह "जीसीसी 4.2 प्रीप्रोसेसिंग" के तहत है (या बस खोज बॉक्स में "प्रीप्रो" डालें) ...

... हालाँकि, मेरे जीवन के लिए मैं इसे काम नहीं कर सकता।

मेरे पास मेरे मानक डिबग और रिलीज़ कॉन्फ़िगरेशन हैं, और मैं डिबगिंग कॉन्फ़िगरेशन में DEBUG = 1 को परिभाषित करना चाहता हूं। लेकिन इसे मूल्य के रूप में जोड़ने के बाद:

(सेटिंग्स विंडो में)> प्रीप्रोसेसर मैक्रोज़: DEBUG = 1

#if DEBUG
    printf("DEBUG is set!");
#endif 

... कभी प्रिंट नहीं होता / कहा जाता है। यह मुझे पागल कर रहा है...


10
#If DEBUG के बजाय, #if परिभाषित (DEBUG) या #ifdef DEBUG
Simo Salminen

अजीब तरह से, मैंने खुद को 2019 में यहां स्विफ्ट और एक्सकोड 10.3 के साथ पाया। ऊपर वर्णित एक ही समस्या वाले किसी व्यक्ति को यह मददगार लग सकता है; यह निश्चित रूप से मेरे #if DEBUGजीवन में लाया :) stackoverflow.com/a/47395485/2778502
jeff-h

1

जीसीसी प्रीप्रोसेसिंग सेक्शन के बारे में केविन लैइटी की टिप्पणी (cdespinosa का उत्तर देखें) के संदर्भ में, अपनी बिल्ड सेटिंग्स में नहीं दिख रहा है, सक्रिय SDK को एक बनाएं (बेस SDK) इसके बाद और यह खंड दिखाई देगा। आप मेनू प्रोजेक्ट> सेट एक्टिव टारगेट> XXX (बेस एसडीके) चुनकर ऐसा कर सकते हैं। XCode (बेस SDK) के विभिन्न संस्करणों में शायद अलग-अलग हो, जैसे (प्रोजेक्ट सेटिंग या प्रोजेक्ट डिफ़ॉल्ट)।

आपके द्वारा यह खंड प्रकट होने के बाद, आप उपयोगकर्ता-निर्धारित सेटिंग बनाने के बजाय प्रोसेसर मैक्रोज़ में अपनी परिभाषाएँ जोड़ सकते हैं।


1

Xcode 9.4.1 और C ++ प्रोजेक्ट के लिए। const char*प्रीप्रोसेसर मैक्रोज़ को डिबग और रिलीज़ दोनों में जोड़ना ।

  1. अपने प्रोजेक्ट का चयन करें

    प्रोजेक्ट का चयन करें

  2. बिल्ड सेटिंग्स का चयन करें

    बिल्ड सेटिंग्स चुनें

  3. " प्रीप्रोसेसर मैक्रोज़ " खोजें

    search1 search2

  4. इंटरैक्टिव सूची खोलें

    इंटरैक्टिव सूची खोलें

  5. अपने मैक्रोज़ जोड़ें और उद्धरण से बचने के लिए मत भूलना

    रास्ता जोड़ो

  6. स्रोत कोड में सामान्य के रूप में उपयोग करें const char*

    ...
    #ifndef JSON_DEFINITIONS_FILE_PATH
    static constexpr auto JSON_DEFINITIONS_FILE_PATH = "definitions.json";
    #endif
    ...
    FILE *pFileIn = fopen(JSON_DEFINITIONS_FILE_PATH, "r");
    ...

0

आप उस लक्ष्य को डुप्लिकेट कर सकते हैं जिसमें प्रीप्रोसेसिंग अनुभाग है, जिसे आप चाहते हैं किसी भी नाम पर इसका नाम बदलें, और फिर अपना प्रीप्रोसेसिंग मैक्रो मान बदलें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.