2010-03-16 12 views
9

में नहीं मान लीजिए मैं उन तीन फ़ाइलें है:संकलित पुन: घोषणा त्रुटि, लेकिन सी

आह

//a.h header 
#include <stdio.h> 
int int_variable; 

void a_f() 
{ 
    printf("int_variable: %d\n", int_variable) 
    int_variable++; 
} 

bh

//b.h header 
#include <stdio.h> 
int int_variable; 

void b_f() 
{ 
    printf("int_variable: %d\n", int_variable) 
    int_variable++; 
} 

मुख्य .c

//main.c 
#include "a.h" 
#include "b.h" 

int main() 
{ 
    a_f(); 
    b_f(); 
    return 0; 
} 

सी ++ में संकलन क्यों Redefinition त्रुटि उत्पन्न करता है, लेकिन सी में नहीं है? मैं सी ++ डेवलपर हूं, फिर सी ++ में मुझे समझ में आता है, लेकिन सी में क्यों यह कोई त्रुटि नहीं है?

जब मैं निष्पादित सी कोड उत्पन्न, उत्पादन किया गया था:

पूर्णांक चर: 0

पूर्णांक चर: 1

+7

डुप्लिकेट (प्रकार)। Http://stackoverflow.com/questions/2331584/global-variable-implementation/2331782#2331782 और http://stackoverflow.com/questions/1987413/inclusion-of-unused-symbols-in-object-files-by देखें -compiler-इन-सी बनाम-सी/1987495 # 1987495। जवाब है: सी में टिकाऊ परिभाषाएं हैं, सी ++ नहीं है। –

+0

सटीक डुप्लिकेट! –

+1

क्षमा करें, मैंने वास्तव में खोज की है, लेकिन मुझे लगता है कि मैंने गलत कीवर्ड के साथ ऐसा किया: पी, धन्यवाद आलोक। – coelhudo

उत्तर

7

सी में, दो चर वास्तव में में जोड़ दिया जाता है एक परिवर्तनीय क्योंकि न तो स्पष्ट रूप से प्रारंभ किया गया है।

आप के लिए दोनों अपने ज फ़ाइलों को बदलते हैं:

// a.h 
int int_variable = 0; 

और:

// b.h 
int int_variable = 0; 

आप एक नई परिभाषा त्रुटि मिल जाएगा।

2

हेडर फ़ाइल में वैश्विक चर का उपयोग केवल "बाहरी" संशोधक के साथ ही किया जाना चाहिए। कोई अपवाद नहीं। आगे बढ़ें अपने चर को एक या अधिक शीर्षलेख फ़ाइलों (अधिमानतः केवल एक) में घोषित करें, फिर इसे एक संकलन इकाई में परिभाषित करें।

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