2009-07-20 13 views
9

मैं सी के लिए नया हूं, और मुझे कुछ स्रोत कोड दिया गया है जिसे किसी और ने लिखा है जो विंडोज़ पर संकलित किया गया था।विंडोज और लिनक्स पर संकलन

लिनक्स पर संकलन करने की कोशिश करने के बाद मुझे त्रुटियां हैं क्योंकि लिनक्स ड्वॉर्ड, वर्ड और यूआईएनटी 32 का समर्थन नहीं करता है। उदाहरण के लिए मेरे पास 6 फाइलें हैं। एएच, ए सी, बीएच, बी सी, सीएच, सीसी। ये कीवर्ड सभी फाइलों में हैं।

तो मैं 2 संभावित समाधानों के बारे में सोच रहा हूं। जो बेहतर है # परिभाषित या टाइपिफ़।

1)

typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 

2)

#define DWORD unsigned long 
#define WORD unsigned short 
#define UINT32 unsigned int 

दूसरे भाग मैं सोच रहा हूँ जहाँ मैं इन घोषणाओं डाल चाहिए। क्या उन्हें हेडर फाइलों में जाना चाहिए, या क्या उन्हें स्रोत फाइलों में जाना चाहिए?

उदाहरण के लिए मुझे हेडर फ़ाइलों में या स्रोत फ़ाइलों में ऐसा कुछ करना चाहिए?

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

उपरोक्त सुझावों के लिए बहुत धन्यवाद,

उत्तर

13

आप समाधान अपने आप को मिल गया है:

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

एक अलग हेडर फाइल (typedefs.h) में इस रखो और हर जगह से यह शामिल हैं। Typedef हमेशा प्री प्रोसेसर मैक्रोज़ पर पसंद किया जाता है।

मेरी सिफारिश: DWORD, WORD या अन्य Win32 प्रकारों का उपयोग न करें। मैं आमतौर पर सी 99 मानक प्रकारों का उपयोग करना पसंद करता हूं: uint_t, int_t या uint16_t, uint32_t

+0

मुझे इसे मारो .. धीमी टाइपिंग –

+0

के लिए मुझे जो मिलता है, यदि आप क्रॉस प्लेटफार्म संगतता को बनाए रखने जा रहे हैं, तो आप इसे windows.h नाम वाली फ़ाइल में रखना चाहेंगे, जो कि आप एक मानक स्थान पर रहते हैं, चूंकि यह विंडोज़ पर फाइल है जो आपको ये घोषणाएं देती है। –

+0

यदि मशीन में लंबी = 8 (64 बिट मशीनें) हैं, तो टाइपपीफ हस्ताक्षरित int DWORD का उपयोग करें। – Antarus

4

टाइपपीफ निश्चित रूप से अच्छे हैं। #defines प्रीप्रोसेसर मैक्रो हैं और इनके अनपेक्षित परिणाम हो सकते हैं, क्योंकि मूल रूप से सी प्रीप्रोसेसर परिभाषित करने के लिए वैश्विक खोज-और-प्रतिस्थापन करता है। Typedefs संकलक के लिए निर्देश हैं, और आप जो करना चाहते हैं उसके लिए बेहतर अनुकूल है।

2

टाइपिफ़ इस उदाहरण में बेहतर होगा क्योंकि #define केवल एक सामान्य तंत्र है लेकिन टाइपिफ़ाई परिभाषित प्रकारों के लिए है जो आप कर रहे हैं।

मैं अपने कोड डाल कहना होगा: एक नया हेडर फाइल में

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

(#define गार्ड के साथ/# pragma एक बार), तो शामिल है कि आवश्यक के रूप में शीर्ष लेख या स्रोत फ़ाइलों से।

1

टाइपिफ़ का उपयोग करके परिणाम को वास्तविक प्रकार में बदल दिया जाता है जो वाक्यविन्यास पेड़ में डाल दिया जाता है। (दूसरे शब्दों में, कंपाइलर्स इसके बारे में जानते हैं और इसे भाषा के एक हिस्से के रूप में पहचानते हैं।)

#define, इसके विपरीत, केवल एक टेक्स्ट प्रतिस्थापन है। तो संकलक को इसके बारे में कभी पता नहीं चला है, इसके बजाय यह जो कुछ भी है उसे प्रतिस्थापित करता है। यह संकलन त्रुटियों को कठिन बना सकता है।

आपके मामले में, मैं शायद टाइपपीफ की अनुशंसा करता हूं। #define की जगह है, लेकिन मुझे कोई कारण नहीं दिख रहा है कि आप टाइपिफ़ का उपयोग क्यों नहीं करना चाहते हैं।

ध्यान रखें कि अन्य पुस्तकालयों ने इन प्रकारों को परिभाषित किया हो सकता है, इसलिए आपके पास टकराव हो सकते हैं।यदि आप वास्तव में क्रॉस-प्लेटफ़ॉर्म बनना चाहते हैं, तो आप किसी भी तरह से अपने ऐप के नामस्थान के साथ प्रकारों को परिभाषित करने के बारे में सोच सकते हैं।

myapp_dword 
myapp_word 

अन्य पुस्तकालयों के साथ टकराव को कम करने के लिए।

अंत में, मैं वास्तव में आपके द्वारा उठाए जा रहे पूरे दृष्टिकोण के खिलाफ अनुशंसा करता हूं। यदि संभव हो, तो भाषा में और सी मानक पुस्तकालय (जैसे size_t, आदि) में परिभाषित केवल टाइपनामों का उपयोग करना सबसे अच्छा है, आपका कोड अधिक पोर्टेबल होगा, और आपके पास कम सिरदर्द होगा।

+0

हैलो। जब आप भाषा में और सी मानक पुस्तकालय में परिभाषित टाइपनाम कहते हैं। क्या मुझे सभी DWORD, WORD, और UINT32 को इन्हें बिना हस्ताक्षरित लंबे, हस्ताक्षरित लघु और हस्ताक्षरित int में बदलना चाहिए। DWORD, WORD, आदि का उपयोग करने के बजाय ऐसा इसलिए है क्योंकि वे प्रकार विंडोज और लिनक्स दोनों पर काम करेंगे? बहुत धन्यवाद। – ant2009

+0

हां, आम तौर पर मैं यही कह रहा हूं। हालांकि, मानक सी लाइब्रेरी ALSO उन प्रकारों को परिभाषित करता है जिनके पास सीमा के बारे में विशिष्ट गारंटी है। size_t इस प्रकार का एक अच्छा उदाहरण है। – Christopher

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