2010-05-24 17 views
6

मुझे क्लाइंट को सी स्थैतिक पुस्तकालय प्रदान करने की आवश्यकता है और एक संरचना परिभाषा अनुपलब्ध बनाने में सक्षम होने की आवश्यकता है। इसके शीर्ष पर मुझे ग्लोबल वैरिएबल का उपयोग करके लाइब्रेरी प्रारंभ में मुख्य से पहले कोड निष्पादित करने में सक्षम होना चाहिए।स्थिर पुस्तकालय में संरचना परिभाषा को छिपाएं

private.h 


#ifndef PRIVATE_H 
#define PRIVATE_H 

typedef struct TEST test; 

#endif 


private.c (this should end up in a static library) 

#include "private.h" 
#include <stdio.h> 

struct TEST 
{ 
TEST() 
{ 
    printf("Execute before main and have to be unavailable to the user.\n"); 
} 

int a; // Can be modified by the user 
int b; // Can be modified by the user 
int c; // Can be modified by the user 

} TEST; 


main.c 

test t; 

int main(void) 
{ 
t.a = 0; 
t.b = 0; 
t.c = 0; 

return 0; 
} 

जाहिर है इस कोड काम नहीं करता है किसी को जानता है यह काम करने के लिए कैसे ... लेकिन दिखाने मैं क्या करने की जरूरत ...:

यहाँ मेरी कोड है? मैं थोड़ा सा गूगल करता हूं लेकिन एक जवाब नहीं मिल रहा है, किसी भी मदद की सराहना की जाएगी।

टीआईए!

उत्तर

7

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

void runs_before_main(void) __attribute__((constructor)) 
{ 
    ... 
} 

जीसीसी प्रलेखन

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

आप ऑर्डर को नियंत्रित करने के लिए प्राथमिकता प्रदान कर सकते हैं जिसमें कन्स्ट्रक्टर और विनाशक फ़ंक्शन चलाए जा रहे हैं। एक प्राथमिकता संख्या कन्स्ट्रक्टर से पहले एक बड़ी प्राथमिकता संख्या के साथ एक कन्स्ट्रक्टर; विपरीत संबंध विनाशकों के लिए है। इसलिए, यदि आपके पास एक कन्स्ट्रक्टर है जो संसाधन और एक विनाशक को आवंटित करता है जो समान संसाधन को हटा देता है, तो फ़ंक्शंस दोनों में आमतौर पर प्राथमिकता होती है। निर्माता और नाशक कार्यों के लिए प्राथमिकताओं नाम स्थान-गुंजाइश सी ++ वस्तुओं

आप, उपयोगकर्ताओं से एक struct को छिपाने के एक शीर्ष लेख में struct की घोषणा लेकिन सी में यह निर्धारित करना चाहते हैं के लिए निर्दिष्ट उन जैसे ही हैं फाइल, पॉइंटर्स के चारों ओर गुजर रहा है। एक उदाहरण के रूप:

// foo.h 
typedef struct private_foo foo; 
foo * create_foo(void); 
void free_foo(foo * f); 

// foo.c 
struct private_foo { 
    int i; 
} 
foo * create_foo(void){ 
    foo * f = malloc(sizeof(*foo)); 
    if (f) f->i = 1; 
    return f; 
} 
... 

foo->i तो foo.c बाहर पहुँचा नहीं जा सकता।

3

यदि आप क्लाइंट कोड "t.a = ..." का उपयोग करने में सक्षम होना चाहते हैं, तो आप संरचना परिभाषा को छिपा नहीं सकते हैं। क्या आप चाहते हैं एक अपारदर्शी प्रकार कहा जाता है, जो कुछ इस तरह दिखेगा:

 
public.h: 
struct foo; 
set_a(struct foo *, int); 
struct foo * new_foo(void); 

main.c: 
#include <public.h> 
int main(void) 
{ 
    struct foo *k; 
    k = new_foo(); 
    set_a(k, 5); 
} 

संरचना परिभाषा केवल पुस्तकालय के लिए उपलब्ध है। यदि आप लाइब्रेरी स्रोत कोड उपलब्ध नहीं कराते हैं, तो पुस्तकालय के उपयोगकर्ताओं से इसे पूरी तरह छिपाना संभव है।

2

सी में कोई पोर्टेबल तरीका नहीं है यह सुनिश्चित करने के लिए कि आपका कोड main() से पहले चलाएगा।मैं क्या करूँगा बस अपनी लाइब्रेरी में initialised ध्वज बनाए रखें, झूठी पर सेट करें, और फिर अपने init फ़ंक्शन को तब तक कुछ भी करने से इंकार कर दें।

के रूप में:

static int initialised = 0; 

int init (void) { 
    // do something. 
    initialised = 1; 
    return ERR_OK; 
} 

int all_other_functions (void) { 
    if (!init) 
     return ERR_NOT_INITED; 

    // do something. 
    return ERR_OK; 
} 
+0

की अनुमति देता है संकलक संभाल के लिए एक अधूरी प्रकार का उपयोग प्रकार त्रुटियों को पकड़ने के लिए, और कार्यान्वयन कार्यों में कास्टिंग टाल। –

+0

कंपाइलर _still_ पकड़ प्रकार त्रुटियों को कर सकता है क्योंकि आपका लाइब्रेरी कोड सही टाइप किए गए चर के साथ काम करता है। या, यदि आप वास्तव में अपने कार्यों को गलत प्रकार दिया गया है, तो यह एक उपयोगकर्ता त्रुटि है और वे जो भी कठिनाई लाएंगे, उनके लायक होंगे :-) जैसा कि मैंने कहा था, यह करने का एकमात्र तरीका है, न कि एकमात्र तरीका। – paxdiablo

+0

पृथ्वी पर क्यों उपयोग शून्य * का उपयोग करेगा और सभी प्रकार की जांच खो देंगे? टाइपपीफ संरचना MyHiddenStruct MyHandle; माईहैंडल * allocHandle(); –

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