2013-10-07 9 views
6
#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \ 
    if (!var.empty()) { \ 
    set_##x_for_serving(r->request, var.data(), var.length()); \ 
    } \ 
} 

ऊपर मैक्रो एक अनुरोध सदस्य सेट करने के लिए अगर यह खाली नहीं है की कोशिश करता है में घोषित नहीं किया गया था, लेकिन मैं इस निम्नलिखित त्रुटि मिलती है: 'set_x_for_serving' इस दायरे जब मैं में घोषित नहीं किया गया था इस मैक्रो का प्रयोग करें।सी मैक्रो - इस दायरे त्रुटि

उपरोक्त मैक्रो में क्या गलत है?

+0

ओपी के कोड हाइलाइटिंग मुझे सुझाव है कि एक सिंटैक्स त्रुटि जो टोकन संयोजन की वजह से बहु लाइन मैक्रो बीच, है कि वहाँ जाने हैं। – dhein

+1

यह एक मैक्रो है, यही है कि इसमें क्या गलत है। यदि आपको मैक्रोज़ के साथ रहना है, तो 'set _ ## x_for_serving' को' set_ ## x ## _for_serving' में बदलें। –

+3

दुनिया में यह ऑफटॉपिक कैसे है? –

उत्तर

9

x के दोनों किनारों पर आपको की आवश्यकता है ताकि इसे सही तरीके से विकल्प प्राप्त किया जा सके।

#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \ 
    if (!var.empty()) { \ 
    set_##x##_for_serving(r->request, var.data(), var.length()); \ 
    } \ 
} 
5

यह SET_NONEMPTY(foobar) की एक मैक्रो कॉल के अंदर की तरह लग रहा है, तो आप उम्मीद करते हैं कि set_##x_for_servingset_foobar_for_serving करने का विस्तार होगा।

क्या यह सही है?

यदि हां, तो वाक्यांश x_for_serving एक एकल टोकन है और x पूर्वप्रक्रमक द्वारा एक आइटम को बदलने के लिए के रूप में नहीं देखा जाएगा।

मुझे लगता है कि आप set_##x##_for_serving बजाय हैं:

#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \ 
    if (!var.empty()) {            \ 
    set_##x##_for_serving(r->request, var.data(), var.length()); \ 
    }                \ 
} 
संबंधित मुद्दे