2010-03-16 2 views
9

Supponiamo che io ho questi tre file:Compilare l'errore ridichiarazione della variabile globale in C++, ma non in C

ah

//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++; 
} 

principali .c

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

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

Perché la compilazione in C++ genera un errore di ridefinizione, ma in C no? Sono uno sviluppatore C++, quindi in C++ ha senso per me, ma perché in C questo non è un errore?

Quando ho eseguito il C codice generato, l'uscita era:

int variabile: 0

int variabile: 1

+7

Duplica (sorta di). Vedi http://stackoverflow.com/questions/2331584/global-variable-implementation/2331782#2331782 e http://stackoverflow.com/questions/1987413/inclusion-of-unused-symbols-in-object-files-by -compiler-in-c-vs-c/1987495 # 1987495. La risposta è: C ha definizioni provvisorie, C++ no. –

+0

duplicato esatto! –

+1

Scusa, ho cercato davvero, ma vedo che l'ho fatto con parole chiave sbagliate: P, grazie Alok. – coelhudo

risposta

7

In C, le due variabili sono in realtà uniti in una singola variabile perché nessuna delle due è esplicitamente inizializzata.

Se si cambia entrambi i file h per:

// a.h 
int int_variable = 0; 

e:

// b.h 
int int_variable = 0; 

si otterrà un errore di ridefinizione.

2

Le variabili globali nel file di intestazione devono essere utilizzate solo con il modificatore "extern". Nessuna eccezione. Inoltra dichiara la tua variabile in uno o più file di intestazione (preferibilmente solo uno), quindi definiscila in una singola unità di compilazione.

Problemi correlati