2012-08-15 23 views
28

एसडीएल की स्थापना कुछ परेशानी हो रही करने के बाद, मुझे पता चला है कि एसडीएल मैक्रो मुख्य बदल देता है परिभाषित करता है:क्यों एसडीएल मुख्य मैक्रो परिभाषित करता है?

#define main SDL_main 

// And then 
extern C_LINKAGE int SDL_main(int argc, char *argv[]); 

यह भी संकलन त्रुटियों बना सकते हैं, मुख्य कार्य argc और argv पैरामीटर परिभाषित नहीं है, तो ।

यह मैक्रो मुझे देखता है जब मैं इसे देखता हूं ... एसडीएल को मुख्य रूप से फिर से परिभाषित करने की आवश्यकता क्यों होती है? कुछ और खोज के बाद, मैंने पाया कि कुछ लोग #undef main, और इसे सामान्य तरीके से उपयोग करते हैं।

तो यह सवाल है:एसडीएल को मुख्य रूप से फिर से परिभाषित करने की आवश्यकता क्यों है, यह क्या करता है? क्या इसे परिभाषित करने के लिए कोई दुष्प्रभाव हैं?

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

उत्तर

29
प्रति the SDL Windows FAQ

:

आप WinMain() के बजाय main() का उपयोग करना चाहिए भले ही आप, एक विंडोज़ अनुप्रयोग का निर्माण कर रहे हैं क्योंकि एसडीएल जो अपने मुख्य कोड कॉल करने से पहले कुछ एसडीएल प्रारंभ करता है WinMain() का एक संस्करण प्रदान करता है।

यदि किसी कारणवश आप, WinMain() का उपयोग src/main/win32/SDL_main.c में एसडीएल स्रोत कोड पर एक नज़र डालें तो आप अपने WinMain() समारोह में करने के लिए इतना है कि एसडीएल ठीक से काम करता जरूरत प्रारंभ की किस तरह देखने के लिए की जरूरत के लिए।

एसडीएल प्रारंभ आवश्यकता है, इसलिए यह अपने आप ही main समारोह है कि अपने "मुख्य" समारोह है, जो यह SDL_main करने का नाम बदलता है इतना है कि यह वास्तविक main समारोह से विरोध नहीं करता कॉल करने से पहले अपने प्रारंभ चलाता injects। के रूप में सवाल जवाब में बताया गया है, अपने main फंक्शन फॉर्म

int main(int argc, char* argv[]) 
+15

लगभग हर लाइब्रेरी को प्रारंभिकरण की आवश्यकता होती है लेकिन यह कैसे करना है इसके लिए एक खराब अभ्यास की तरह दिखता है। वैसे भी +1। –

+12

@ डेविडग्रेसन वास्तव में बहुत खराब अभ्यास, विशेष रूप से यदि आपके पास दो पुस्तकालय हैं जो यह करते हैं ... पेटी में भारी दर्द –

+0

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

5

का होना चाहिए जबकि मैं मानता हूँ कि यह एक अजीब व्यवहार है, क्योंकि वहाँ स्थितियों में, जहां यह एक उचित समाधान है, हालांकि यह काफी हद तक मंच पर निर्भर करता है। विचार करें कि विभिन्न प्लेटफार्मों में अलग-अलग प्रवेश बिंदु हैं। विंडोज आमतौर पर विनमेन है, लिनक्स मुख्य है, जावा में एंड्रॉइड के साथ बातचीत करना होता है, विनआरटी सी ++/सीएक्स एक्सटेंशन का उपयोग करता है, और इसी तरह। कार्यक्रम प्रविष्टि बिंदु और एपीआई बहुत मंच विशिष्ट हो सकते हैं और एसडीएल आपको इससे निपटने की परेशानी को बचाने की कोशिश करता है। यदि आप केवल विंडोज़ को लक्षित कर रहे हैं और एसडीएल केवल आपको WIN32 एपीआई के साथ काम करने की परेशानी बचाने के लिए है, तो आपको इसकी आवश्यकता नहीं हो सकती है। लेकिन यदि आप कभी डेस्कटॉप से ​​परे जाते हैं, तो आप इसे मेरी राय में उपयोगी पाएंगे।

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