2009-09-06 11 views
8

मैं निम्न कार्य में मदद की जरूरत है:सी प्रीप्रोसेसर के माध्यम से पाउंड/हैश प्रिंट कैसे करें?

एक पूर्वप्रक्रमक मैक्रो लेबल (एक्स) करेगा उत्पादन "#x", जैसे,

#define label(x) ... 

अगर मैं लेबल (aname) कहते हैं, उत्पादन "होगा # एनीम "(डब्ल्यू/ओ उद्धरण)

मुझे पता है कि निम्नलिखित प्रयास त्रुटियां थीं।

#define label(x) #x // leads to "x" 
#define label(x) \#x // is \"x" 
#define label(x) "#x" // is "#x" (but not the content of x") "#otto" 

तो इसे छोड़ # (पाउंड) का एक प्रकार मौजूद हो सकता है, लेकिन मैं नहीं जानता, कैसे से बचने के लिए ...

संपादित: मैं चलाने "जीसीसी -E परीक्षण -ओ परीक्षण आउटपुट प्राप्त करने के लिए। एचटीएमएल "। मुद्दा यह है: मैं प्रीप्रोसेसर की क्षमताओं का उपयोग कर एक निर्माता के साथ हैश चिह्न (#) कैसे प्रिंट करूं?

+1

क्या मैं पूछ सकता हूं कि आप क्या करने की कोशिश कर रहे हैं? –

+0

* जी * हां। मैं एचटीएमएल कोड "बनाने" के लिए प्रीप्रोसेसर का उपयोग करूंगा;) लेबल (एक्स) का उपयोग एंकर से लिंक बनाने के लिए किया जाएगा, उदाहरण के लिए, ... मैंने प्रश्न के लिए जटिलता को कम किया। – tuergeist

+0

क्या आप इस एचटीएमएल कोड को सी प्रोग्राम में इस्तेमाल करने के लिए, या वास्तविक एचटीएमएल कोड के रूप में सीधे ब्राउज़र पर जाने के लिए चाहते हैं? –

उत्तर

13

जवाब है::

#define hash # 
#define f(x) x 
#define label(a) f(hash)a 

तो

समस्या सिर्फ मैंने देखा है कि मैं कुछ अतिरिक्त अवांछित उत्पादन, इस प्रकार मिलता है अर्थात् फ़ाइल की पहली 4 लाइनें हैं है

label(foobar) 

बनाता है
#foobar 

मुझे यह की मदद से आप सभी, लेकिन विशेष रूप से सर्दियोंम्यूट की सहायता से मिला। बहुत बहुत धन्यवाद!

(जीसीसी 4.3.3 का उपयोग करना)

+0

लेकिन यह आपके प्रश्न का कोई जवाब नहीं है: आपने उद्धृत अभिव्यक्ति '"#foobar" ' – Christoph

+0

के लिए कहा है क्या यह अच्छी तरह परिभाषित है, या विशिष्ट प्रीप्रोसेसर कार्यान्वयन tuergeist का एक फ़ंक्शन उपयोग कर रहा है? – bdonlan

+0

मैं बस यह कहना चाहता हूं कि, किसी दिन जल्द ही, आप खुद यहां वापस आ सकते हैं और सी या प्रीप्रोसेसर को एक्स या वाई करने के तरीके के बारे में एक और सवाल पूछ सकते हैं। मुझे आशा है कि आपको याद होगा कि मैंने इस बारे में क्या कहा है , और यह कि आप इस नौकरी के लिए एक नया उपकरण खोजने की मेरी सिफारिश पर दृढ़ता से विचार करते हैं। –

1

प्रयास करें:

सी में
#define label(x) "#"x 
+0

केवल ठीक है अगर सी – tuergeist

3

स्ट्रिंग शाब्दिक concatenated किया जाएगा, ताकि आप कर सकते हैं

#define label(x) "#" #x 

मुझे नहीं लगता कि यह स्ट्रिंग संयोजन के बिना संभव है है (यानी सी संकलक के रूप में लागू बिना आप करना चाहते हैं):

आप संकेत के अतिरिक्त स्तर के साथ कुछ फैंसी सामान कर सकते हैं और मुझे प्रीप्रोसेसर भी

के माध्यम से वांछित आउटपुट उत्पन्न करने के लिए मिला है
#define hash # 
#define quote(x) #x 
#define in_between(c, d) quote(C## d) 
#define join(c, d) in_between(c, d) 
#define label(x) join(hash, x) 
label(foo) 

समस्या के रूप में in_between()#foo के लिए विस्तारित है, जो एक वैध पूर्वप्रक्रमक टोकन नहीं है, यह भी एक त्रुटि संदेश उत्पन्न होगा है। मुझे इसके चारों ओर कोई रास्ता नहीं दिख रहा है।

मेरी सलाह नौकरी के लिए सही उपकरण चुनना होगा: यदि आप साहसी महसूस करते हैं या PHP या पर्ल जैसी स्क्रिप्टिंग भाषा का उपयोग करते हैं तो एम 4 या यहां तक ​​कि एमएल/आई जैसी दूसरी मैक्रो भाषा पर स्विच करें। GPP अच्छी तरह से अच्छा लगता है और एक बेहतर फिट हो सकता है।

+0

में char * के रूप में उपयोग किया जाता है, तो '# स्ट्रिंग' 'होता है जो' # स्ट्रिंग ' नहीं है, मैं पूछ सकता हूं कि आपने अपने उत्तर का परीक्षण कैसे किया? – tuergeist

+0

सी भाषा में, 'char * c = "#" "स्ट्रिंग" लिखना; '' char * c = "#string" लिखने के समान है;' - भाषा स्ट्रिंग अक्षर को एक दूसरे के बगल में जोड़ती है। इस प्रकार, यह प्रीप्रोसेसर के साथ काम नहीं करता है, लेकिन सी भाषा के साथ काम करता है। –

+0

जैसा कि मैंने लिखा है, मैं प्रीप्रोसेसर के आउटपुट का उपयोग करूंगा, कोई अतिरिक्त सी कंपाइलर नहीं चलेगा। – tuergeist

4

मुझे नहीं लगता कि आप कर सकते हैं, जो पूरी तरह से अनुचित नहीं है क्योंकि सी प्रीप्रोसेसर के आउटपुट को एक अनूठा '#' नहीं बनाया जाना चाहिए क्योंकि इससे पूर्व प्रोसेसर निर्देश इंगित होता है, और आप प्री-प्रोसेसर निर्देश उत्पन्न नहीं कर सकते उस तरह की फ्लाई पर।

दूसरे शब्दों में, सी प्रीप्रोसेसर सी (और सी ++) के लिए एक प्रीप्रोसेसर है और पूरी तरह से सामान्य उद्देश्य उपकरण नहीं है।

या तो वैकल्पिक मैक्रो प्रोसेसर का उपयोग करें (m4 यूनिक्स-जैसी प्रणालियों पर मानक अनुशंसा है), या चीजों के बारे में अलग-अलग जाएं।

उदाहरण के लिए, मैक्रो प्रतिस्थापन है: '! @'

#define label(x) [email protected]!x 

फिर बाद प्रक्रिया उत्पादन की जगह साथ में '#'।

(imake प्रोग्राम एक समान स्टंट का उपयोग करता है; सी प्रीप्रोसेसर अधिकांश काम करता है, लेकिन इसका आउटपुट 'मेक' द्वारा आवश्यक लाइन ब्रेक को संरक्षित नहीं करता है, इसलिए 'imake' नोटेशन '@@ \' का उपयोग करता है या सी प्रीप्रोसेसर ने सबसे खराब होने के बाद लाइन ब्रेक को डालने की आवश्यकता है यह इंगित करने के लिए।)

+0

आपके सुझाव के लिए धन्यवाद ... – tuergeist

+0

बॉक्स के बाहर सोचने के लिए +1 – nalply

4

आप कुछ इस तरह कर सकते हैं:

#define f(x) x 
#define label(a) f(#)a 

मैं cpp (सी पूर्वप्रक्रमक के माध्यम से सीधे इसे चलाने) के बजाय gcc के माध्यम से करके यह परीक्षण किया गया। उदाहरण:

cpp test > test.html 

जीसीसी संस्करण 4.0.1 का हिस्सा है जो सीपीपी का उपयोग करना।

# 1 "test" 
# 1 "<built-in>" 
# 1 "<command line>" 
# 1 "test" 
+0

2:16: त्रुटि: '#' मैक्रो पैरामीटर – tuergeist

+0

@ tuergeist - मैं वास्तव में आप से थोड़ा अलग परीक्षण किया। मेरी अद्यतन पोस्ट देखें। –

+0

ये पहली पंक्ति ठीक है और इसे अनदेखा किया जा सकता है। – tuergeist

संबंधित मुद्दे