प्रीप्रोसेसर निर्देश में ## (डबल हैश) क्या करता है?


91
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

उपरोक्त पंक्ति अवास्तविक 4 से ली गई है, और मुझे पता है कि मैं इसे अवास्तविक मंचों पर पूछ सकता हूं, लेकिन मुझे लगता है कि यह एक सामान्य सी ++ प्रश्न है जो यहां पूछा जा रहा है।

मैं समझता हूं कि पहली पंक्ति एक मैक्रो को परिभाषित करती है, हालांकि मैं C ++ में प्रीप्रोसेसर शॉननिगन्स में अच्छी तरह से वाकिफ नहीं हूं और इसलिए मैं वहां खो गया हूं। लॉजिक मुझे बताता है कि बैकस्लैश का मतलब है कि अगली लाइन पर घोषणा जारी है।

FThreadSafeStaticStat एक टेम्पलेट की तरह दिखता है, लेकिन वहां # चल रहा है और एक सिंटैक्स जो मैंने पहले कभी C ++ में नहीं देखा है

क्या कोई मुझे बता सकता है कि इसका क्या मतलब है? मैं समझता हूं कि आपके पास अवास्तविक 4 तक पहुंच नहीं हो सकती है, लेकिन यह सिर्फ वाक्यविन्यास है जो मुझे समझ में नहीं आता है।


6
आप अन्य बातों के अलावा, cppreference पर ## ऑपरेटर के बारे में पढ़ सकते हैं
Cubbi

1
##है / को संघटन संचालक कहा जा सकता है।
dyp

1
ओह, यह बहुत अच्छा है! यह बहुत कुछ समझाता है, धन्यवाद। लेकिन स्ट्रक्चर कीवर्ड का उपयोग क्यों किया जाता है? यह रेखा एक चर परिभाषा की तरह दिखती है
DavidColson

1
structएक परिचय विस्तृत प्रकार निर्दिष्टकर्ता जहाँ तक मैं बता सकता है।
dyp

2
आधिकारिक नाम "टोकन चिपकाने वाला ऑपरेटर" है, क्योंकि यह दूसरे का उत्पादन करने के लिए दो प्रीप्रोसेसिंग टोकन को जोड़ता है। ध्यान दें कि यह केवल तभी मान्य है जब परिणाम एक मान्य प्रीप्रोसेसिंग टोकन है, जैसे आप + ## 3बनाने के लिए नहीं कर सकते +3। (लेकिन आप + 3ऑपरेटर के बिना, निश्चित रूप से कर सकते हैं )
एमएम

जवाबों:


175

## संघनन के लिए प्रीप्रोसेसर ऑपरेटर है।

तो अगर आप उपयोग करते हैं

DEFINE_STAT(foo)

कोड में कहीं भी, इसे बदल दिया जाता है

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

आपके कोड को संकलित करने से पहले।

इसे आगे समझाने के लिए मेरा एक ब्लॉग पोस्ट का एक और उदाहरण है ।

#include <stdio.h>

#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Stumped?\n");
}

यह कार्यक्रम सफलतापूर्वक संकलित और निष्पादित करेगा, और निम्न आउटपुट का उत्पादन करेगा:

Stumped?

जब इस कोड पर प्रीप्रोसेसर लगाया जाता है,

  • begin के साथ बदल दिया गया है decode(a,n,i,m,a,t,e)
  • decode(a,n,i,m,a,t,e) के साथ बदल दिया गया है m ## a ## i ## n
  • m ## a ## i ## n के साथ बदल दिया गया है main

इस प्रकार प्रभावी रूप से, के begin()साथ प्रतिस्थापित किया जाता है main()


8
मैं ## के व्यवहार को सीखने के लिए इतना सोचने की उम्मीद नहीं कर रहा था, लेकिन मुझे लगता है कि अब मैं इसे कभी नहीं भूलूंगा? तो धन्यवाद।
NicoBerrogorry

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