2010-06-21 11 views
5

कोई प्रोग्राम लोड होने पर फ़ंक्शन चलाने के लिए कोई तंत्र या चाल है?क्या आप सी में प्रारंभिक पर एक फ़ंक्शन चला सकते हैं?

मैं क्या हासिल करने की कोशिश कर रहा हूँ ...

void foo(void) 
{ 
} 

register_function(foo); 

लेकिन स्पष्ट रूप से register_function नहीं चलेंगे।

तो सी ++ में एक चाल एक समारोह रन

कुछ की तरह

int throwaway = register_function(foo); 

बनाने के लिए प्रारंभ उपयोग करने के लिए है, लेकिन है कि सी में काम नहीं करता है तो मैं इस के चारों ओर एक रास्ता तलाश कर रहा हूँ मानक सी (कुछ भी नहीं मंच/विशिष्ट संकलक)

+4

'मुख्य()' के साथ क्या गलत है? –

+0

क्योंकि मुझे एक संख्या .c फाइल चाहिए, और मैं नहीं चाहता कि लोगों को पंजीकरण समारोह को मुख्य रूप से रखना पड़े। –

उत्तर

14

का उपयोग कर आप जीसीसी का उपयोग कर रहे हैं, तो आप जैसे एक constructor समारोह विशेषता के साथ ऐसा कर सकते हैं,:

#include <stdio.h> 

void foo() __attribute__((constructor)); 

void foo() { 
    printf("Hello, world!\n"); 
} 

int main() { return 0; } 

हालांकि, सी में ऐसा करने का कोई पोर्टेबल तरीका नहीं है।

यदि आपको अपने निर्माण प्रणाली से गड़बड़ नहीं है, हालांकि, आपके पास और विकल्प हैं। उदाहरण के लिए, आप कर सकते हैं:

#define CONSTRUCTOR_METHOD(methodname) /* null definition */ 

CONSTRUCTOR_METHOD(foo) 

अब CONSTRUCTOR_METHOD के उदाहरणों की खोज, और एक उत्पन्न ग फ़ाइल में एक समारोह में उन्हें कॉल का एक अनुक्रम चिपकाने के लिए एक निर्माण स्क्रिप्ट लिखने। main() की शुरुआत में जेनरेट किए गए फ़ंक्शन को आमंत्रित करें।

+0

अच्छा, मैं जो चाहता हूं, लेकिन मैं कुछ और मानक सी की उम्मीद कर रहा था –

+1

यहां C++ नहीं कर रहा है, सी ++ –

+0

में इसका मामूली रूप से आसान Bdonlan का समाधान C++ का उपयोग नहीं करता है। इसे फिर से पढ़ें; यह केवल जीसीसी-विशिष्ट है। –

0

ऐसा करने का कोई मानक तरीका नहीं है हालांकि जीसीसी constructor कार्यों के लिए विशेषता प्रदान करता है।

कुछ प्री-सेटअप सुनिश्चित करने का सामान्य तरीका किया गया है (संकलन समय मान के लिए एक सरल चर प्रारंभिक के अलावा) यह सुनिश्चित करना है कि सभी कार्यों को पूर्व-सेटअप की आवश्यकता हो। दूसरे शब्दों में, कुछ:

static int initialized = 0; 
static int x; 

int returnX (void) { 
    if (!initialized) { 
     x = complicatedFunction(); 
     initialized = 1; 
    } 
    return x; 
} 

यह एक अलग पुस्तकालय में किया जाता है क्योंकि यह आपको कार्यान्वयन से प्रेरित करता है।

+0

हाँ .... हालांकि मेरे मामले में मैं एक प्री-सेटअप चाहता हूं जहां एक फ़ंक्शन पंजीकृत और एक सूची में संग्रहीत किया जाएगा ..... फिर बाद में पंजीकृत कार्यों को चलाने वाली सूची के माध्यम से कुछ कुछ होगा। वर्तमान में इसका मतलब है कि प्रत्येक केंद्रीय स्थान को प्रत्येक केंद्रीय स्थान में स्पष्ट रूप से जोड़ा जाना चाहिए। मैं एक चाल खोजना चाहता था जहां घोषणा के बिंदु पर समारोह पंजीकृत किया जा सकता है –

3

मानक सी इस तरह के एक ऑपरेशन का समर्थन नहीं करता है। यदि आप ऐसा करने के लिए कंपाइलर विशिष्ट विशेषताओं का उपयोग नहीं करना चाहते हैं, तो आपकी अगली सबसे अच्छी शर्त एक वैश्विक स्थैतिक ध्वज बनाने के लिए हो सकती है जो गलत के लिए शुरू की गई है। फिर जब भी कोई आपके ऑपरेशन में से किसी एक को आमंत्रित करता है जिसके लिए फ़ंक्शन पॉइंटर पंजीकृत होना आवश्यक होता है, तो आप उस ध्वज को चेक करते हैं। यदि यह गलत है तो आप फ़ंक्शन पंजीकृत करते हैं और फिर ध्वज को सत्य पर सेट करते हैं। बाद के कॉलों को पंजीकरण करने की आवश्यकता नहीं होगी। यह ओओ सिंगलटन डिजाइन पैटर्न में उपयोग किए जाने वाले आलसी त्वरण के समान है।

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

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