2011-01-30 8 views
5

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

समारोह जीसीसी के लिए popen कहा जाता है, लेकिन MSVS के लिए _popen, इसलिए मैं अपने स्रोत कोड के लिए निम्न कहा:

#ifdef _MSC_VER 
#define popen _popen 
#define pclose _pclose 
#endif 

यह काम करता है, लेकिन मैं समझने के लिए के लिए एक मानक समाधान वहाँ मौजूद है या नहीं चाहते हैं ऐसी समस्याएं (मुझे stricmp/strcasecmp के साथ एक समान मामला याद है)।

  1. _MSC_VER सही ध्वज पर निर्भर है: विशेष रूप से, मैं समझने के लिए निम्नलिखित चाहते हैं? मैंने इसे चुना क्योंकि मुझे लगता है कि लिनक्स पर्यावरण "अधिक मानक" है।
  2. यदि मैं कुछ हेडर फ़ाइल में इन #define को डालता हूं, तो क्या यह महत्वपूर्ण है कि (popen के मामले में) से पहले या #include है?
  3. यदि _popen को मैक्रो के रूप में परिभाषित किया गया है, तो क्या मेरे पास #define विफल हो जाएगा? क्या मुझे उस कारण या किसी अन्य कारण के लिए my_popen जैसे "नया" टोकन का उपयोग करना चाहिए?
  4. क्या कोई पहले से ही मेरे लिए यह काम करता है और एक अच्छा "पोर्टेबिलिटी हेडर" फ़ाइल बनाता है जिसे मैं उपयोग कर सकता हूं?
  5. मुझे और कुछ भी पता होना चाहिए?

उत्तर

1

जिस तरह से आप इसे कर रहे हैं ठीक है (#ifdef आदि के साथ) लेकिन आपके द्वारा परीक्षण किए जाने वाले मैक्रो नहीं हैं। popen ऐसा कुछ है जो आपके ऑपरेटिंग सिस्टम पर निर्भर करता है न कि आपके कंपाइलर पर।

मैं अव्यवस्थित फाइलों #ifdef .. #else .. #endif ब्लॉक युक्त साथ समाप्त करने के बजाय तरह

#if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 2) 
/* system has popen as expected */ 
#elif defined(YOUR_MACRO_TO DETECT_YOUR_OS) 
# define popen _popen 
# define pclose _pclose 
#elif defined(YOUR_MACRO_TO DETECT_ANOTHER_ONE) 
# define popen _pOpenOrSo 
# define pclose _pclos 
#else 
# error "no popen, we don't know what to do" 
#endif 
1
  1. _MSC_VER MSVC संकलक का पता लगाने के लिए सही मैक्रो है। आप जीसीसी के लिए का उपयोग कर सकते हैं।

  2. आप अपने मैक्रो आईडी के रूप में popen का उपयोग करने जा रहे हैं, तो मैं आपको सुझाव है #include यह बाद की वजह से 3.

  3. आप #include यह stdio.h के बाद, यह AFAIK काम करना चाहिए, लेकिन खेद की तुलना में बेहतर सुरक्षित , नहीं? इसे portable_popen या कुछ कहें।

  4. कई परियोजनाओं (मेरे कुछ सहित) में पोर्टेबिलिटी हेडर होता है, लेकिन आमतौर पर इसे स्वयं रोल करना बेहतर होता है। यदि आपके पास समय है तो मैं चीजों को स्वयं करने का प्रशंसक हूं। इस प्रकार आप अपने कोड के ब्योरे को जानते हैं (अगर चीजें गलत होती हैं तो डीबग करना आसान होता है), और आपको अपनी जरूरतों के अनुरूप कोड मिलता है।

  5. मुझे नहीं पता कि। मैं बिना किसी समस्या के इस तरह की चीजें करता हूं।

3
  1. बेहतर है एक windows-विशिष्ट परिभाषित करते हैं (_WIN32 शायद) क्योंकि MinGW यह या तो नहीं होगा के लिए जाँच करने के लिए। popen() मानकीकृत है (यह part of the Single UNIX® Specification v2 है)
  2. नहीं; जब तक मैक्रो को इसके पहले उपयोग से पहले परिभाषित किया जाता है, इससे कोई फर्क नहीं पड़ता कि _popen() को बाद में परिभाषित नहीं किया गया है।
  3. नहीं; आपके पास क्या ठीक है भले ही _popen एक मैक्रो है।
  4. यह कई बार किया गया है लेकिन मुझे एक स्वतंत्र रूप से लाइसेंस प्राप्त संस्करण के बारे में पता नहीं है जिसका आप उपयोग कर सकते हैं।
0

कुछ के लिए जाना चाहते हैं, मैं विभिन्न प्लेटफार्मों के लिए अलग अलग फ़ाइलों का उपयोग कर एक संस्करण पसंद करते हैं:

  • मंच प्रति एक फ़ाइल और #define एक मैक्रो my_popen
  • में ओएस निर्भर परिभाषाओं डालयह फ़ाइल आपके प्लेटफ़ॉर्म-अज्ञेय कोड
  • कभी भी ओएस फ़ंक्शंस को कॉल नहीं करती है, लेकिन आपके द्वारा बनाए गए #define (यानी। my_popen)
  • अपने ओएस के आधार पर, संकलन के लिए अलग हेडर (linux पर config/windows/mydefines.h जैसे खिड़कियों पर और config/linux/mydefines.h उपयोग करते हैं, तो सेट पथ उचित और हमेशा #include "mydefines.h")

ओएस की तुलना में एक अधिक स्वच्छ दृष्टिकोण भी होता है स्रोत में निर्णय ही।

तरीकों आप विंडोज और लिनक्स के बीच अलग अलग व्यवहार करते हैं, निर्णय लेने में एक व्यवहार आप उपयोग कर रहे होंगे कॉल कर रहे हैं (यानी या तो हमेशा खिड़कियों व्यवहार या हमेशा linux व्यवहार) और फिर करने के लिए आवरण तरीकों बनाने इस लक्ष्य को हासिल करें। इसके लिए, आपको config/OSTYPE निर्देशिकाओं में रहने वाली फ़ाइलों को केवलफ़ाइलों की आवश्यकता नहीं होगी, बल्कि myfunctions.c फ़ाइलों की भी आवश्यकता होगी।

इसे उस तरह से कर रहा है, तो आप भी लाभ मिलता है, जब यह लिनक्स और विंडोज संस्करण diff की बात आती है: आप बस, जबकि ही फ़ाइल का लिनक्स और विंडोज ब्लॉक पर एक diff कर कठिन हो सकता है दो फ़ाइलों diff सकता है ।

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

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