GCC 7.3 - 3.5. Concatenation

३.५ समास




gcc

३.५ समास

मैक्रो का विस्तार करते हुए दो टोकन को एक में विलय करना अक्सर उपयोगी होता है। इसे टोकन पेस्टिंग या टोकन कॉन्सेप्टन कहा जाता है। ' ## ' प्रीप्रोसेसिंग ऑपरेटर टोकन चिपकाने का काम करता है। जब एक मैक्रो का विस्तार किया जाता है, तो प्रत्येक ' ## ' ऑपरेटर के दोनों ओर दो टोकन एक एकल टोकन में संयोजित होते हैं, जो तब ' ## ' और दो मूल टोकन को मैक्रो विस्तार में बदल देता है। आमतौर पर दोनों पहचानकर्ता होंगे, या एक एक पहचानकर्ता होगा और दूसरा एक प्रीप्रोसेसिंग नंबर होगा। जब चिपकाया जाता है, तो वे एक लंबी पहचान बनाते हैं। यह एकमात्र वैध मामला नहीं है। एक संख्या में दो संख्याओं (या एक संख्या और एक नाम, जैसे कि 1.5 और e3 ) को e3 भी संभव है। साथ ही, मल्टी-कैरेक्टर ऑपरेटर्स जैसे कि += को टोकन पेस्ट करके बनाया जा सकता है।

हालाँकि, दो टोकन जो एक साथ एक वैध टोकन नहीं बनाते हैं, उन्हें एक साथ चिपकाया नहीं जा सकता है। उदाहरण के लिए, आप x को किसी भी क्रम में + साथ नहीं बदल सकते। यदि आप प्रयास करते हैं, तो प्रीप्रोसेसर चेतावनी जारी करता है और दो टोकन का उत्सर्जन करता है। क्या यह टोकन के बीच सफेद स्थान रखता है, अपरिभाषित है। कॉम्प्लेक्स मैक्रोज़ में ' ## ' का अनावश्यक उपयोग करना आम है। यदि आपको यह चेतावनी मिलती है, तो संभावना है कि आप ' ## ' को हटा सकते हैं।

' ## ' द्वारा संयुक्त दोनों टोकन मैक्रो बॉडी से आ सकते हैं, लेकिन आप उन्हें पहले स्थान पर एक टोकन के रूप में लिख सकते हैं। टोकन चिपकाना सबसे उपयोगी है जब एक या दोनों टोकन मैक्रो तर्क से आते हैं। यदि ' ## ' के आगे का कोई भी टोकन एक पैरामीटर नाम है, तो इसे ' ## ' निष्पादित करने से पहले इसके वास्तविक तर्क से बदल दिया जाता है। स्ट्रिंग करने के साथ, वास्तविक तर्क पहले मैक्रो-विस्तारित नहीं है। यदि तर्क खाली है, तो उस ' ## ' का कोई प्रभाव नहीं है।

ध्यान रखें कि सी प्रीप्रोसेसर मैक्रोज़ पर विचार करने से पहले टिप्पणी को व्हाट्सएप में बदल देता है। इसलिए, आप ' / ' और ' * ' नाम से एक टिप्पणी नहीं बना सकते। आप कमेंट्स सहित ' ## ' और उसके ऑपरेंड्स के बीच में ज्यादा से ज्यादा व्हाट्सएप डाल सकते हैं और आप कॉमेंट में उन टिप्पणियों को डाल सकते हैं, जिन्हें कंटेस्ट किया जाएगा। हालाँकि, यह एक त्रुटि है अगर ' ## ' किसी स्थूल शरीर के अंत में दिखाई देता है।

एक सी प्रोग्राम पर विचार करें जो कमांड नाम की व्याख्या करता है। संभवतः आदेशों की एक तालिका होनी चाहिए, शायद निम्नानुसार घोषित संरचनाओं की एक सरणी:

struct command
{
  char *name;
  void (*function) (void);
};
struct command commands[] =
{
  { "quit", quit_command },
  { "help", help_command },
  …
};

यह क्लीनर होगा प्रत्येक कमांड नाम को दो बार नहीं देना होगा, एक बार स्ट्रिंग में स्थिर और एक बार फ़ंक्शन नाम में। एक मैक्रो जो एक तर्क के रूप में एक कमांड का नाम लेता है, इसे अनावश्यक बना सकता है। स्ट्रिंग स्थिरांक को स्ट्रिंगिंग के साथ बनाया जा सकता है, और फ़ंक्शन नाम को ' _command ' के साथ तर्क को संक्षिप्त करके । यहाँ यह कैसे किया जाता है:

#define COMMAND(NAME)  { #NAME, NAME ## _command }

struct command commands[] =
{
  COMMAND (quit),
  COMMAND (help),
  …
};

अगला: वैरिएडिक मैक्रोज़ , पिछला: Stringizing , अप: Macros [ Contents ] [ Index ]