2011-11-10 8 views
5

मैं वही #ifdef WxWidgets, SDL इत्यादि द्वारा उपयोग किए जाने वाले दृष्टिकोण का उपयोग करना चाहता हूं। केवल समस्या यह है कि मुझे इसका उपयोग नहीं करना है।क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी बनाने के लिए आप प्रीप्रोसेसर का उपयोग कैसे करते हैं?

कहें कि मैं एक कक्षा बनाना चाहता हूं जो एक आयत खींचती है।

class graphics 
{ 
void drawRect(int x, int y, int w, int h) 
{ 
/*if on win32*/ 
HDC myHdc = ::BeginPaint(myHwnd,&mypstr); 
::Rectangle(myHdc,x,y,w,h); 
::EndPaint(myHwnd,&mypstr); 

/*if on x11*/ 
cairo_surface_t* s = cairo_xlib_surface_create(/* args */); 
cairo_t* c = cairo_create(s); 
cairo_rectangle(c,x,y,w,h); 
// etc. etc. 
} 
}; 

मैं #ifdef कैसे प्रयोग करेंगे या कुछ और यह करने के लिए: मैं इसे Win32 प्लेटफार्मों पर जब X11 प्लेटफार्मों (जैसे लिनक्स) और GDI पर काहिरा उपयोग करना चाहते हैं?

+0

WxWidgets और SDL प्रीप्रोसेसर उदाहरण प्रदान नहीं करते हैं जिन्हें आप ढूंढ रहे हैं? –

+1

(+1) प्रश्न शीर्षक द्वारा प्रस्तुत अवधारणा, एक अपवर्तनीय मूल्यवान है। उत्तर नहीं है, अन्य डेवलपर्स के जवाब पढ़ रहे हैं ... – umlcat

उत्तर

3

आप कर सकते हैं, तो में मंच विशिष्ट विधियों डाल करने के लिए पसंद करते हैं अलग अनुवाद इकाइयों। इससे क्लीनर & अधिक पठनीय कोड और विकसित और बनाए रखने में आसान हो जाएगा। आईएमएचओ, निर्माण प्रक्रिया को निर्धारित करना चाहिए कि कौन सा मंच विशिष्ट मॉड्यूल शामिल करना है।

उदाहरण के लिए:
rectangle.hpp:

struct Rectangle 
{ 
    void draw(int upper_left_corner_x, int upper_left_corner_y, 
      unsigned int length, unsigned int width); 
} 

अब मंच विशिष्ट फ़ाइलों:
rectangle_wx_widgets.cpp:

#include "rectangle.hpp" 
void 
Rectangle :: 
draw(int upper_left_corner_x, int upper_left_corner_y, 
      unsigned int length, unsigned int width) 
{ 
// wxWidgets specific code here. 
} 

rectangle_qt.cpp:

#include "rectangle.hpp" 
void 
Rectangle :: 
draw(int upper_left_corner_x, int upper_left_corner_y, 
      unsigned int length, unsigned int width) 
{ 
// QT specific code here. 
} 

main.cpp:

#include "rectangl.hpp" 
int main(void) 
{ 
    Rectangle r; 
    r.draw(50, 50, 10, 5); 
    return 0; 
} 

ऊपर कोड कोई सशर्त पूर्वप्रक्रमक निर्देशों है। main फ़ंक्शन प्लेटफ़ॉर्म पर ध्यान दिए बिना एक आयताकार खींचता है। प्लेटफ़ॉर्म के विनिर्देश main से हटा दिए गए हैं क्योंकि वे महत्वपूर्ण नहीं हैं। तो, किसी भी कंपाइलर स्विच को बदलने के बिना या प्रीप्रोसेसर पहचानकर्ता को परिभाषित करने के बारे में चिंता करने के बिना, कोई देख सकता है कि main बिना शर्त आयताकार खींचता है।

WxWidgets प्लेटफ़ॉर्म का उपयोग करने के लिए, निर्माण प्रक्रिया rectangle_wx_widgets.cpp का उपयोग करेगी। क्यूटी का उपयोग करने के लिए, rectangle_qt.cpp फ़ाइल का उपयोग किया जाएगा, लेकिन दोनों नहीं। चूंकि यह चित्र दिखाता है, किसी भी मंच के लिए कोड तैयार करने के लिए कोई कोड नहीं बदला जाता है।कोई बिल्ड प्रक्रिया को तैयार कर सकता है ताकि build wxWidgets कमांड में उचित अनुवाद इकाइयां शामिल हों। इस प्रकार निर्माण प्रक्रिया में पैरामीटर पास करने से मंच विशिष्ट निष्पादन योग्य उत्पन्न होता है।

+0

मैं मानता हूं कि आपका समाधान क्लीनर लगता है। (+1), लेकिन मुझे एक या दो समस्याएं समझती हैं, अगर मैं शीर्षलेख में कुछ बदलना चाहता हूं तो क्या होगा? उदाहरण के लिए यदि विंडोज़ टाइपिफ एचडीसी पेंटर 'अन्य' टाइपपीफ कैरो_टी पेंटर ' – ApprenticeHacker

+0

@IntermediateHacker: प्लेटफ़ॉर्म विशिष्ट फ़ाइलों में प्लेटफ़ॉर्म विशिष्ट हेडर शामिल हो सकते हैं। आपके उत्तर उदाहरण में, आप एक सामान्य 'पेंट' विधि तैयार करेंगे जो ढांचा विशिष्ट है। विंडोज एपीआई के लिए 'पेंट' और काहिरा के लिए 'पेंट' होगा। और जहां तक ​​संभव हो इसे नीचे प्रचारित करें। इसका उद्देश्य सशर्त प्रीप्रोसेसर निर्देशों की मात्रा को कम करना है। –

+0

धन्यवाद। आपका समाधान पूरी तरह से काम करता है। – ApprenticeHacker

0

वे काफी प्रत्यक्ष हैं।

#ifndef WIN32 
// something for X11 
#else 
// something for Windows 
#endif 

यह (इस मामले में WIN32) की तरह डिफ़ॉल्ट सशर्त, जानने का मामला है:

आप कुछ इस तरह करना चाहते हैं। ऑपरेटिंग सिस्टम, कंपाइलर्स और पोर्टेबिलिटी सामान के लिए सशर्त हैं।

इस मामले के लिए, windows.h शीर्षलेख फ़ाइल देखें। इसमें आपके लिए अधिक जानकारी हो सकती है।

+0

आप शायद 'ifdef' चाहते हैं ताकि आप दो से अधिक का समर्थन कर सकें। –

0

WIN32 तरह पूर्वनिर्धारित मंच चर है कि आप उपयोग कर सकते हैं कर रहे हैं:

#ifdef WIN32 
.... 
#else 
.... 
#endif 
2

क्रॉस-प्लेटफ़ॉर्म का मतलब केवल यूनिक्स बनाम विंडोज़ नहीं है। भी, पूर्वनिर्धारित सीपीपी निर्देश संकलक निर्भर हो सकते हैं। बूस्ट प्लेटफ़ॉर्म चयन स्रोत कोड यह देखने के लिए एक अच्छी शुरुआत है कि यह सही तरीके से कैसे किया जा सकता है। देख config/select_platform_config.hpp तुम भी जो कुछ platform dependent defines

+0

"यूनिक्स बनाम विंडोज़" निहितार्थ के लिए खेद है, इसका इरादा नहीं था। मैं बस बिंदु को समझाना चाहता था। – ApprenticeHacker

+1

कोई पन इरादा नहीं है, मैं बस अपना अंक – user237419

+0

कोई समस्या नहीं बना रहा था। (+1) :) – ApprenticeHacker

0

सेट वहाँ यह करने के लिए एक चाल है कि मैं दूसरों का उल्लेख नहीं दिख रहा है है cmake पर एक नज़र लेने के लिए चाहते हो सकता है (संपादित करें: sysfault यह उल्लेख किया)। यहां काम पर दो अलग-अलग अवधारणाएं हैं। प्रीप्रोसेसर कमांड आपके लक्ष्य और आपके कंपाइलर दोनों के आधार पर भिन्न होंगे। अर्थात्, जो संकलक आप उपयोग कर रहे (GCCMSVC बनाम)

#ifdef _MSC_VER 
    /*MSVC*/ 
#endif 
#ifdef __GNUC__ 
    /*GCC*/ 
#endif 

MSVC केवल Windows लक्ष्यों के लिए संकलित कर देगा (जहाँ तक हम आज चिंतित हैं) बताने के लिए, और जीसीसी सब कुछ निशाना बनाता है। जीसीसी के लिए, यह बताने के लिए जो ओएस यह लक्षित कर रहा है:

#ifdef __MINGW32__ 
    /* Windows */ 
#endif 
#ifdef BSD 
    /* BSD */ 
#endif 
#ifdef __linux__ 
    /* linux */ 
#endif 
#ifdef __APPLE__ 
    /* OSX */ 
#endif 

इसके अलावा, कभी कभी आप प्रोसेसर के लिए विशिष्ट कुछ पता करने की जरूरत है, लेकिन नहीं ऑपरेटिंग सिस्टम:

__CHAR_UNSIGNED__ 
    GCC defines this macro if and only if the data type char is unsigned on the target machine. 
__BYTE_ORDER__ 
__ORDER_LITTLE_ENDIAN__ 
__ORDER_BIG_ENDIAN__ 
__ORDER_PDP_ENDIAN__ 
    __BYTE_ORDER__ is defined to one of the values __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__, or __ORDER_PDP_ENDIAN__ to reflect the layout of multi-byte and multi-word quantities in memory. 
__LP64__ 
_LP64 
    These macros are defined, with value 1, if (and only if) the compilation is for a target where long int and pointer both use 64-bits and int uses 32-bit. 

और कई कई अन्य लोगों के

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