2012-04-09 11 views
8

मैंने कई स्थानों पर पढ़ा है कि एक सी संरचना सुरक्षित रूप से कई बार परिभाषित की जा सकती है, और फिर भी मुझे एक संरचना को परिभाषित करने के लिए जीसीसी से "संरचना का पुनर्वितरण" त्रुटि मिलती है (एकाधिक शामिलियों के माध्यम से)। एक बहुत ही सरल उदाहरण इस प्रकार है:क्या सी सी संरचना को कई बार परिभाषित किया जा सकता है?

foo.c:

#include "a.h" 
#include "b.h" 

int main(int argc, char *argv[]) { 
    struct bar b; 
    b.a = 2; 
    return 0; 
} 

आह:

struct bar { 
    int a; 
    int b; 
}; 

bh:

#include "a.h" 

struct buz { 
    int x; 
    int y; 
}; 

अगर मैं gcc foo.c चलाने मैं:

In file included from b.h:1:0, 
       from foo.c:2: 
a.h:1:8: error: redefinition of ‘struct bar’ 
a.h:1:8: note: originally defined here 

मुझे पता है कि मैंने कोई भी गार्ड शामिल नहीं किया है और वे संकलन त्रुटि को ठीक करेंगे, लेकिन मेरी समझ यह थी कि यह फिर भी काम करना चाहिए। मैंने foo.c में दो struct bar परिभाषाओं की भी कोशिश की और मुझे एक ही त्रुटि संदेश मिलता है? तो, क्या structs को सी में पारस्परिक समय परिभाषित किया जा सकता है या नहीं?

उत्तर

12

सी में एक संरचना घोषित कई बार सुरक्षित रूप से घोषित की जा सकती है, लेकिन केवल एक बार परिभाषित की जा सकती है।

struct bar; 
    struct bar{}; 
    struct bar; 

, ठीक संकलित रूप में आप की तरह है क्योंकि बार केवल एक बार परिभाषित और रूप में कई बार घोषित किया जाता है।

+2

बहुत सही उदाहरण, और ओपी के लिए अच्छा उदाहरण :) – Lefteris

+0

हाँ, मूल रूप से सी में हर चीज़ को कई बार घोषित किया जा सकता है लेकिन एक बार परिभाषित किया जा सकता है। –

+0

ठीक है, मुझे लगता है कि चीज़ों को साफ़ करता है। धन्यवाद। – Elektito

0

संरचना केवल आपके द्वारा संकलित प्रत्येक फ़ाइल के लिए परिभाषित की जा सकती है। यहां, आप दो बार एएच सहित हैं। (एक बार सीधे और एक बार बीएच के माध्यम से)

आपको अपना कोड बदलना होगा ताकि प्रतीक केवल एक स्रोत स्रोत फ़ाइल के लिए परिभाषित किया जा सके।

0

नहीं, उन्हें कई बार परिभाषित नहीं किया जा सकता है और यही कारण है कि आपके पास #ifndef में गार्ड शामिल हैं और उनका उपयोग करना चाहिए।

b.h हेडर फाइल के अंदर होने

#include "a.h" 

आप बार फिर से परिभाषित मतलब है। यदि आपके पास #ifndef गार्ड शामिल हैं तो यह नहीं होगा।

0

आपके पास अपनी हेडर फ़ाइल में #ifdef मैक्रोज़ नहीं हैं। यदि आप अपने शीर्षलेखों को एकाधिक स्रोत फ़ाइलों में शामिल करते हैं, तो आपको उस त्रुटि का सामना करना पड़ेगा।

0

उसी दायरे में एक ही प्रतीक को दो बार परिभाषित नहीं किया जा सकता है। आप शायद इस बात का जिक्र कर रहे हैं कि दो अलग-अलग सी फाइलों से संरचना को शामिल करना सुरक्षित है, जिसका अर्थ है कि उन्हें दो बार परिभाषित किया जाता है (क्योंकि कोई निर्यात नहीं है) और इन structs को साझा करना कोई समस्या नहीं होगी, क्योंकि वे संकलित हैं एक ही मेमोरी लेआउट

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