2010-07-12 14 views
6

मेरे पास दो सी फाइलें हैं, foo.c कार्यक्षमता और test_foo.c के साथ foo.c. के कार्यों का परीक्षण करती है।बाहरी टाइपपीफ संरचना कैसे घोषित करें?

क्या स्ट्रिप टाइपिफ़ BAR तक पहुंचने का कोई तरीका है, मैंने test_foo.c में foo.c में हेडर फ़ाइल का उपयोग किए बिना परिभाषित किया है? अब तक, मैं एक एच फाइल से बचने में सक्षम था ताकि पूरे कार्यक्रम में foo.c. शामिल होगा। धन्यवाद।

foo.c 
typedef struct BAR_{...} bar; 
BAR *bar_new(...) {..} 

test_foo.c 
extern BAR *bar_new(...) 

error: expected declaration specifiers or ‘...’ before ‘BAR’

उत्तर

6

उत्तर यह है कि एक है, और आपको इसके बजाय हेडर फ़ाइल का उपयोग करना चाहिए। आप संरचना typedef struct BAR_{...} bar; की परिभाषा test_foo.c में कॉपी कर सकते हैं और यह काम करेगा। लेकिन यह नकल का कारण बनता है। प्रत्येक समाधान जो काम करता है उसे test_foo.c में कंपाइलर के लिए उपलब्ध संरचना का कार्यान्वयन करना चाहिए। यदि आप इस मामले में उपयुक्त हैं तो आप एडीटी का भी उपयोग कर सकते हैं।

+1

हेडर फ़ाइल में परिभाषा को स्थानांतरित करना केवल सही समाधान है यदि test_foo.c (या foo.c के बाहर किसी भी अन्य मॉड्यूल) को सामग्री संरचना तक पहुंचने की आवश्यकता है। यदि यह एक एडीटी है या किसी अन्य कारण के लिए test_foo.c प्रकार के आंतरिक की आवश्यकता नहीं है, तो मुझे लगता है कि आगे की घोषणा एक बेहतर समाधान है। – harald

+1

अभी के लिए, मैंने सिर्फ परिभाषा को अन्य सी फाइल में कॉपी किया है। – Framester

+0

मैं वही कर रहा हूं - मैं एक परीक्षण दोहन विकसित कर रहा हूं जिसे उत्पादन कोड के चारों ओर लपेटना है। उत्पादन कोड में संरचना परिभाषा का कोई व्यवसाय सार्वजनिक नहीं होता है और इसे दफनाया जाना चाहिए। इसलिए मुझे अपनी टेस्ट दोहन में परिभाषा की प्रतिलिपि बनाना पड़ा। यह नकल है लेकिन मेरा लिंकर मुझे चेतावनी देने के लिए काफी समझदार है अगर कोई बदलता है लेकिन दूसरा नहीं। – Nick

1

आप test_foo.c में बार की परिभाषा की आपूर्ति करने की आवश्यकता होगी। क्या हेडर रखने के लिए वह डुप्लिकेशंस बेहतर है या नहीं।

4

टाइपपीफ ड्रॉप करें।

foo.c में:

struct bar 
{ 
    ... 
}; 

struct bar *bar_new(....) 
{ 
    return malloc(sizeof(struct bar)); 
} 

test_foo.c में:

struct bar; 

struct bar *mybar = bar_new(...); 

नोट है कि आप केवल इस तरह से एक struct बार वस्तु के अस्तित्व मिलता है, test_foo.c में उपयोगकर्ता वस्तु की सामग्री के बारे में कुछ भी नहीं पता है।

+0

आप टाइपिफ़ को भी रख सकते हैं और फिर इसे foo.c में रद्द कर सकते हैं। – Nick

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