2012-05-15 25 views
8

के साथ त्रुटि दे रहा है मेरे पास निम्न सी कोड है, जो मेरे लिए बहुत सही दिखता है। हालांकि, क्लैंग कंपाइलर (वास्तव में जीसीसी या कोई अन्य सी संकलक) अन्यथा सोचता है।मुझे समझ में नहीं आता क्यों संकलक मुझे इस कोड

typedef struct 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
} Timer; 

void startTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

void stopTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_end), NULL); 
} 

कंपाइलर निम्नलिखित waring & त्रुटि संदेश देता है। कोई विचार क्या गलत है?

./timing.h:14:25: warning: declaration of 'struct Timer' will not be visible 
     outside of this function [-Wvisibility] 
void startTimer(struct Timer* ptimer) 
         ^
./timing.h:16:27: error: incomplete definition of type 'struct Timer' 
    gettimeofday(&(ptimer->td_start), NULL); 
        ~~~~~~^ 
./timing.h:14:25: note: forward declaration of 'struct Timer' 
void startTimer(struct Timer* ptimer) 
         ^
./timing.h:19:24: warning: declaration of 'struct Timer' will not be visible 
     outside of this function [-Wvisibility] 
void stopTimer(struct Timer* ptimer) 
        ^
./timing.h:21:27: error: incomplete definition of type 'struct Timer' 
    gettimeofday(&(ptimer->td_end), NULL); 
        ~~~~~~^ 
./timing.h:19:24: note: forward declaration of 'struct Timer' 
void stopTimer(struct Timer* ptimer) 

उत्तर

15

struct कीवर्ड निकालें (यह आवश्यक नहीं है के बाद से आप पहले से ही typedef है struct एड):, अधिक जानकारी के लिए

struct Timer 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
}; 

void startTimer(struct Timer* ptimer) 
{ 
    ... 

void stopTimer(struct Timer* ptimer) 
{ 
    ... 

:

void startTimer(Timer* ptimer) 
{ 
    ... 

void stopTimer(Timer* ptimer) 
{ 
    ... 

वैकल्पिक रूप से typedef निकालने के लिए, देखें Why should we typedef a struct so often in C?

+2

एक बेहतर समाधान: टाइपपीफ का उपयोग न करें! –

+0

विलियम: लेकिन आपको एएनएसआई सी में संरचना संरचना के साथ संरचना को उपसर्ग करना होगा! सी ++ में मैं सहमत हूं कि संरचना की आवश्यकता नहीं है। हालांकि सी 99 के बारे में निश्चित नहीं है। – pythonic

4

या तो आप

struct Timer 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
}; 

void startTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

या आप

typedef struct 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
} Timer; 

void startTimer(Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

लेकिन Mixup नहीं है।

3

आप एक प्रकार टाइमर बुलाया बनाया है, सिर्फ शब्द struct समारोह मापदंडों से पहले, इस तरह, हटाने उदाहरण के लिए:

void startTimer(Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 
2

त्रुटि के लिए कारण कि, जब आप यहाँ प्राप्त

है
void startTimer(struct Timer* ptimer) 

दायरे में कोई struct Timer नहीं है (केवल अज्ञात संरचना के लिए टाइपिफ़)। तो संकलक का मानना ​​है कि आप नयाstruct Timer टाइप करना चाहते हैं और पैरामीटर के रूप में उस पर एक पॉइंटर का उपयोग करना चाहते हैं।

वास्तव में ऐसा करना उपयोगी से कम होगा, क्योंकि इस प्रकार फ़ंक्शन के अंदर दिखाई देगा। इससे से फ़ंक्शन के बाहर पैरामीटर में पास करना व्यावहारिक रूप से असंभव हो जाएगा।

तो संकलक कहता है कि, संभवतः भाषा द्वारा अनुमत होने पर, यह एक अच्छा विचार नहीं दिखता है!

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