2012-01-03 11 views
20

वस्तु उन्मुख भाषाओं (C++) आप एक वैश्विक वस्तु या एक वर्ग स्थिर वस्तु का उपयोग करके main() से पहले कोड निष्पादित और उनके कंस्ट्रक्टर्स कोड आप चाहते हैं चलाने सकते हैं।निष्पादित कोड main()

क्या सी में ऐसा करने का कोई तरीका है? मुझे कोई विशिष्ट समस्या नहीं है जिसे मैं हल करने की कोशिश कर रहा हूं, मैं सिर्फ उत्सुक हूं। लाइब्रेरी को स्वचालित रूप से प्रारंभ करने के लिए यह एक उपयोगी हो सकता है।

+0

http://stackoverflow.com/questions/949890/how-can-i-perform-pre-main-initialization-in-cc-with-avr-gcc – stacker

+0

@stacker - सवाल आप का उल्लेख करने के लिए विशिष्ट है Arduino पर्यावरण। वैसे भी, उत्तर उपयोगी हो सकता है। – mouviciel

उत्तर

10

__attribute__ का उपयोग करने के तरीके हैं लेकिन ये आपके कंपाइलर और कोड के लिए बहुत विशिष्ट हैं जो इनके द्वारा लिखे गए हैं वास्तव में पोर्टेबल नहीं हैं। दूसरी ओर, सी भाषा कोई स्टार्ट-अप मॉड्यूल/पुस्तकालय प्रदान नहीं करती है।

सी में, तार्किक main() पहले समारोह ओएस द्वारा कहा जाता है। लेकिन main() पर कॉल करने से पहले, ओएस ने विभिन्न पर्यावरण चर सेट करने के लिए start-up मॉड्यूल नामक एक और फ़ंक्शन को कॉल किया, प्रारंभिक (अन-प्रारंभिक) स्थैतिक चर प्रारंभ करें, एक स्टैक फ्रेम (सक्रियण रिकॉर्ड) बनाएं और स्टैक क्षेत्र की शुरुआत में स्टैक पॉइंटर प्रारंभ करें और अन्य main() पर कॉल करने से पहले किए जाने वाले कार्यों को करना होगा।

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

आईओओ, स्टार्ट-अप मॉड्यूल प्रोग्रामर के लिए नहीं हैं।

+0

गलत, 'मुख्य' ओएस द्वारा बुलाया पहला कार्य नहीं है। क्या आपने [crt0] (https://en.wikipedia.org/wiki/Crt0) के बारे में सुना है? '_start' को हमेशा 'मुख्य' से पहले बुलाया जाता है, और विंडोज़ में, 'विनमेन' को 'मुख्य' से पहले भी कहा जाता है। –

0

आप वैश्विक चर को प्रारंभ कर सकते हैं, लेकिन इन initializations भीतर कार्यों फोन नहीं।

1

नहीं, आप सी में ऐसा नहीं कर सकते हैं, और मैं तर्क दूंगा कि आप वास्तव में "से पहले निष्पादित कोड" C++ में नहीं प्राप्त कर सकते हैं। हाँ, यह लिपि में main() से पहले प्रकट हो सकता है, लेकिन main() जहां कार्यक्रम वास्तव में शुरू होता है।

अब, आप मूल्यों को प्रारंभ कर सकते हैं, यह संभव है। आप प्री-सेट स्थिति के साथ चर भी कर सकते हैं, लेकिन यह वही बात नहीं है।

+3

प्रति 3.6.2/3 ("यह उसी अनुवाद इकाई में परिभाषित किसी भी फ़ंक्शन या ऑब्जेक्ट के पहले उपयोग से पहले होता है क्योंकि ऑब्जेक्ट को प्रारंभ किया जाना चाहिए"), उसी टीयू में नेमस्पेस स्कोप वाले ऑब्जेक्ट्स 'मुख्य' के रूप में होना चाहिए 'मुख्य' के पहले कथन से पहले शुरू किया गया, चूंकि 'मुख्य' * एक ही टीयू में एक कार्य है। मानक इस बात पर परवाह नहीं करता है कि किसी भी अन्य बयान से पहले, 'मुख्य' के फ़ंक्शन बॉडी के अंदर से उस कोड को कॉल करने के लिए कॉल किया गया है या फिर कोई अन्य फ़ंक्शन इनिट करने के लिए है या नहीं, कार्यान्वयन कॉल को कॉल करने से पहले कॉल करता है। –

4
जीसीसी के साथ

, आप निर्माता समारोह विशेषता का उपयोग करता है, उदा करके कर सकते हैं

__attribute__ ((__constructor__)) 
void foo(void) { 
     ... 
} 

यह मुख्य से पहले foo का आह्वान करेगा।

नोट: यह शायद अन्य कंपाइलरों के लिए पोर्टेबल नहीं है।

13

आप __attribute__ ((constructor)) साथ यह कर सकते हैं। मैंने निम्नलिखित उदाहरणों का परीक्षण gcc और clang दोनों के साथ किया है। कहा जा रहा है, यह भाषा का हिस्सा नहीं है।

#include <stdio.h> 

void __attribute__ ((constructor)) premain() 
{ 
    printf("premain()\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    printf("main()\n"); 
    return 0; 
} 

यह करता है निम्नलिखित:

$ ./test 
premain() 
main() 
0
किसी भी मानकों का अनुपालन करने रास्ते में

, लेकिन आप क्या वास्तव में होता है जब आपके ऑपरेटिंग सिस्टम द्विआधारी छवि लोड करता है और आवेदन मुख्य फ़ंक्शन को कॉल करने के लिए खुदाई करना चाहिए !

0

मुख्य कार्य निष्पादित किए जाने वाले कार्यों को निर्दिष्ट करने के पोर्टेबल तरीके हैं जिन्हें "बाद" निष्पादित किया जा सकता है।

  1. atexit()

  2. at_quick_exit()

इसके अलावा, this लिंक और C++ प्रारंभ के विभिन्न प्रकार के बारे में का पालन करें - आप मुख्य पहले कोड को निष्पादित करने के लिए (उपयोगी हो सकता है) कहा जाता है ।

+0

आगे, इस [लिंक] का पालन करें (http://en.cppreference.com/w/cpp/language/initialization) और C++ में प्रारंभिकरण के विभिन्न प्रकारों के बारे में - यह आपके लिए मुख्य() से पहले कोड निष्पादित करने के लिए उपयोगी हो सकता है बुलाया। –

+0

प्रश्न सी में मुख्य से पहले कोड को कॉल करना था। मुख्य, या सी ++ के बाद कोड को कॉल न करें। –

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