2010-05-15 15 views
10

मैं मुसीबत सी लेखन ++ कोड एक सी फ़ाइल के लिए बनाया गया एक हेडर फाइल का उपयोग करता है हो रहा है के रूप में कीवर्ड वर्ग का प्रयोग करें। विशेष रूप से, हेडर फाइल एक चर नाम कहा जाता वर्ग प्रयोग किया है:सी में एक चर नाम ++

int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs); 

यह सी में काम करता है के रूप में कक्षा एक कीवर्ड के रूप में नहीं लिया जाता है, लेकिन C++, वर्ग है। तो क्या वैसे भी मैं इस हेडर फ़ाइल को C++ फ़ाइल में शामिल कर सकता हूं, या क्या मैं भाग्य से बाहर हूं?

धन्यवाद।

+0

कि कोड एक सी ++ संकलक द्वारा पार्स किया जाता के लिए तैयार नहीं है, तो और अधिक मुसीबत के लिए तैयार रहना। उदाहरण के लिए, यदि यह एक सी lib है जिसे आप लिंक करना चाहते हैं, तो सभी घोषणाओं को 'बाहरी' सी '' में लपेटा जाना चाहिए ताकि लिंकर को पता चले कि इसे असंगत प्रतीकों की तलाश करने की आवश्यकता है। – sbi

+0

संकलक अभी भी एक फिट जब मैं सिर्फ एक extern "सी" में #include लपेट फेंकता है। क्या मुझे आपके अंदर आआ की चाल शामिल करनी चाहिए? –

+0

मुझे अभी एहसास हुआ कि यह एक पायथन हेडर है। मुझे नहीं पता कि आप किस हेडर का उपयोग कर रहे हैं और इसके लिए क्या उपयोग किया जाता है, लेकिन क्या आप http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html जानते हैं? – sbi

उत्तर

9

कोशिश कुछ:

#define class class_variable 
// if class is only used in declarations, you can also do 
// #define class 
#include "c.h" 
#undef class 

यह समस्या पैदा कर सकता है, लेकिन एक शॉट हो सकता है लायक

विकल्प (का उपयोग कर Makefile):

python_.hpp: /usr/include/python.h 
    perl -pe 's/\Wclass\W//g' $< > [email protected] 
... 

#include "python_.hpp" 
+0

यह काम किया ... हालांकि मैंने पुस्तकालयों को अभी तक लिंक नहीं किया है, हालांकि धन्यवाद। –

+0

@ लीफ शुभकामनाएं।प्रीप्रोसेस्ड फाइल का मैन्युअल रूप से निरीक्षण करना भी चाहते हैं, बस यह सुनिश्चित करें कि – Anycorn

+1

कोई भी अवांछित साइड इफेक्ट्स नहीं पेश किए गए हैं, यदि आप किसी भी मानक लाइब्रेरी हेडर का उपयोग करते हैं, तो किसी कीवर्ड के साथ मैक्रो को परिभाषित करने के रूप में इसके नाम की अनुमति नहीं है (cf. http: // stackoverflow .com/प्रश्न/2726204/सी पूर्वप्रक्रमक-परिभाषित-इंग-ए-कीवर्ड-है यह मानकों-अनुरूप)। सी इस संबंध में सी ++ की तुलना में थोड़ा अधिक उदार है। –

3

तुम हमेशा #ifdef __cplusplus का उपयोग करें कि हैडर

+0

चूंकि यह एक बड़े कोड भंडार का हिस्सा है, इसलिए शायद मुझे हेडर फ़ाइल में ही नहीं मिलना चाहिए। –

3

आपको C++ यह संकलन करने में कुछ और के साथ 'क्लास' को बदलने के लिए शीर्ष लेख को संशोधित करने की आवश्यकता होगी में एक घोषणा सी के लिए विशिष्ट ++ बनाने के लिए कर सकते हैं। इस तरह

1

एक व्यावहारिक मामले के रूप में, आप ' भाग्य से बाहर हो जाओ। "वर्ग" एक आरक्षित शब्द है, तो आप एक चर पहचानकर्ता के रूप में उपयोग नहीं कर सकते।

मैं तुम्हें पूर्वप्रक्रमक चाल कर सकता है, जैसे

#define class othername 

लगता है लेकिन वास्तव में यह है कि, मूर्ख है भी, क्योंकि यह आपके कोड भ्रामक बनाने के लिए और आप असली वर्गों का उपयोग करने से रोक देंगे।

बस गोली काटने और पैरामीटर 'theclass' या कुछ और नाम बदलें।

7

इस घोषणा है केवल, तो चर नाम सब पर कोई फर्क नहीं है। आप उन्हें पूरी तरह से हटा सकते हैं या उन्हें बदल सकते हैं। इसका कारण यह है घोषणा केवल नाम और समारोह है, जो है के प्रकार को परिभाषित करता है:

int BPY_class_validate(const char *, PyObject *, PyObject *, 
         BPY_class_attr_check*, PyObject **); 

लेकिन अगर आप नाम चाहते हैं (थोड़ा और वर्णनात्मक होना करने के लिए), तुम बस के अंत में एक अंडरस्कोर फेंक कर सकते हैं आपके पास क्या है:

int BPY_class_validate(const char *class_type, PyObject *class_, 
         PyObject *base_class, BPY_class_attr_check* class_attrs, 
         PyObject **py_class_attrs); 

यह कोई अन्य कोड नहीं तोड़ देगा।

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