2012-09-21 14 views
5

हाय मैं xcode का उपयोग कर ffmpeg संकलित कर रहा हूं, जो मुझे लगता है कि संकलन के लिए क्लैंग का उपयोग करता है। Ffmpeg में 'वर्ग' नामक सदस्य चर के साथ एक संरचना है, मुझे विश्वास है कि यह सी में बिल्कुल ठीक है लेकिन क्लैंग इसे एक कीवर्ड के रूप में पार्स करने का प्रयास कर रहा है। कोई विचार कैसे ठीक करें? असल में एक सीपीपी फ़ाइल में निम्नलिखित त्रुटि का कारण बन जाएगा:क्लैंग सी कंपाइलर 'कक्षा' कीवर्ड आरक्षित?

extern C { 
    typedef struct { 
     int class; 
    } SomeStruct; 
} 

यह कक्षा को कीवर्ड के रूप में समझने की कोशिश करता है।

FYI फ़ाइल जो ffmpeg में त्रुटि फेंक रही है libavcodec/mpegvideo.h है और मुझे इसे गति मानचित्र जानकारी खींचने के लिए MpegEncContext संरचना तक पहुंचने के लिए शामिल करने की आवश्यकता है।

संपादित

ऊपर कोड नमूना त्रुटि प्रदर्शित करने के लिए बस गया था। लेकिन शायद यह एक और तरीके से तय करने योग्य है। अपने वास्तविक कोड में मैं इसे इस तरह है:

#ifdef __cplusplus 
extern "C" { 
#endif 

    #include "libavcodec/mpegvideo.h" 
    #include "libavformat/avformat.h" 

#if __cplusplus 
} //Extern C 
#endif 

मैं कैसे मिलता है कि सी फ़ाइलों के रूप में दो फ़ाइलों और नहीं सी शामिल करने के लिए होगा ++?

धन्यवाद

+0

और अपने Xcode- (ffmpeg) से संबंधित सवाल यह है: –

+3

hehe: 'निर्वासन कोबोल {एक जोड़ें सी देने बी को}' – pmg

+0

मेरे xcode ffmpeg संबंधित सवाल है, मैं कैसे एक सी में है कि शीर्ष लेख ++ फ़ाइल शामिल है और यह संकलन है एक्सकोड में? – user1689196

उत्तर

4

यह सी में पूरी तरह से ठीक है जब आप इसे सी ++ के रूप में बनाते हैं, तो आपको एक त्रुटि आती है क्योंकि class एक सी ++ कीवर्ड है।

जहां तक ​​इसे ठीक करने के लिए, आप आमतौर पर class के अलावा एक पहचानकर्ता चुनते हैं। हालांकि, ffmpeg डेवलपर उस परिवर्तन के साथ इतना स्वीकार्य नहीं हो सकता है। ,

सौभाग्य सी अनुवाद करने के लिए है कि शीर्ष लेख की दृश्यता को प्रतिबंधित करने या ++ अनुवाद आदेश सी में इसका इस्तेमाल करने में अपनी खुद की प्रतिलिपि संपादित आप भी कर रहे हैं: इसलिए, आप या तो करना पड़ सकता है एक सी कंपाइलर का उपयोग करना जिसमें इस मामले में सी 99 सुविधाओं का अच्छा समर्थन है। सी कंपाइलर्स जो सी 99 अच्छी तरह से समर्थन नहीं करते हैं, विशेष रूप से एफएमपीपीईजी स्रोतों के साथ परेशान हैं (क्योंकि आप सी 99 सुविधाओं के लिए पूरे कार्यक्रम को सी ++ के रूप में संकलित करेंगे, और संघर्ष की गणना बहुत अधिक होगी)।

(वहाँ अन्य गंदा चालें आप समस्या को हल करने के लिए प्रयास करने से कर सकता है, लेकिन मैं उन्हें का उल्लेख नहीं होगा)

+0

क्या आप थोड़ा और बता सकते हैं कि मैं उन शीर्षकों की सी दृश्यों की दृश्यता को कैसे सीमित कर सकता हूं? मुझे लगता है कि मैं उस फ़ाइल का उपयोग किसी भी कोड को स्थानांतरित कर सकता हूं जो उस फ़ाइल को .c फ़ाइल में उपयोग करता है। लेकिन मुझे उस बिंदु पर एक सी ++ फ़ाइल से .c फ़ाइल को अभी भी शामिल करना होगा, मुझे विश्वास है। – user1689196

+0

मुझे लगता है कि मैं केवल संदर्भ के लिए हेडर फ़ाइल का उपयोग कर क्लास वैरिएबल का नाम बदल सकता हूं (ffmpeg पहले से ही लाइब्रेरी में संकलित है) लेकिन मुझे बस स्रोत फ़ाइलों के साथ गड़बड़ाना पसंद नहीं है अगर मुझे यह नहीं करना है, थोड़ा कठिन अद्यतन करता है। – user1689196

+1

@ user1689196 सुनिश्चित करें। आप सही रास्ते पर हैं; आपको या तो एक पतली रैपर परत (सी में) बनाने की आवश्यकता होगी जिसे आप 'कुछ संरचना' के साथ बातचीत करने के लिए सी ++ से कॉल कर सकते हैं, या प्रोग्राम के उस पहलू से निपट सकते हैं जिसमें 'सीस्ट्रक्चर' विशेष रूप से बड़े सी कार्यान्वयन में शामिल है। – justin

4

Basically the following in a cpp file will cause the error

सीपीपी फ़ाइलें सी ++ फ़ाइलें, नहीं सी के रूप में कार्रवाई की जाती है, और class सी में एक आरक्षित शब्द है ++।

+0

लेकिन सी संकलक का उपयोग करने के लिए इसे सी बल नहीं करना चाहिए? – user1689196

+5

@ user1689196, बिलकुल नहीं। यह नाम उलझन रोकने के लिए प्रतीकों के लिंक को बदल देगा। आप -x ध्वज का उपयोग कर भाषा को मजबूर कर सकते हैं। –

+0

नहीं, 'बाहरी सी' बस बदलता है कि नाम मैंगलिंग कैसे काम करता है। सी के रूप में संकलित करने के लिए, .c – Joe

1

आप उन हेडर फाइल में कुछ भी नाम बदलने के लिए एक विकल्प है नहीं है, तुम सिर्फ किसी और

#ifdef __cplusplus 
extern "C" { 
# define class videoClass 
#endif 

    #include "libavcodec/mpegvideo.h" 
    #include "libavformat/avformat.h" 

#if __cplusplus 
# undef class 
} //Extern C 
#endif 

यह काफी गंदा हैक है कुछ द्वारा class टोकन की जगह सकता है, लेकिन इस तरह के बुरी तरह interfaced कोड के लिए आप ज्यादा विकल्प नहीं है। असली समाधान यह होगा कि इन फ़ाइलों में सभी struct सदस्य नामों का उपयोग करते हैं जो हमें कुछ प्रकार के उपसर्ग या ऐसा करते हैं, क्योंकि यह नेटवर्क परत कोड में किया जाता है। वहां सभी सदस्यों के पास ss_ या sa_ के रूप में कुछ उपसर्ग हैं और ऐसी समस्याएं होने की संभावना बहुत कम है।

+0

यह मेरी प्राथमिक गंदे चाल है जब मैंने अपने जवाब में गंदे चाल के बारे में लिखा था :) * (चिंता न करें, मैं नीचे नहीं आऊंगा क्योंकि आप वास्तव में इंगित करने की परेशानी से गुजर चुके हैं और समस्या को समझाते हुए, और यह स्पष्ट किया कि यह गंदा है) * – justin

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