Domanda

Ad esempio:

code1.c / .cpp

int a;

// ... and so on

code2.c / .cpp

int a;

int main(void) {
    return 0;
}

vai alla compilazione:

$gcc code1.c code2.c      # this is fine
$

$g++ code1.cpp code2.cpp  # this is dead
/tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'
/tmp/ccnIOmPC.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

C'è qualche differenza di collegamento delle variabili globali tra C e C ++?

È stato utile?

Soluzione

Non è strettamente legale.int a; è una definizione provvisoria in C. Sono consentite più definizioni provvisorie e al massimo una definizione non provvisoria per unità di traduzione di ciascun oggetto con collegamento esterno in C, ma solo una definizione per tutte le unità di traduzione in un programma.

È un'estensione comunemente implementata per consentire definizioni provvisorie su più unità di traduzione in C purché non più di un'unità di traduzione contenga una definizione non provvisoria, ma non è strettamente standard.

In C ++ int a; è solo una definizione - non esiste il concetto di tentativo - ed è ancora illegale avere più definizioni di un oggetto nelle unità di traduzione di un programma.

Per il caso C, potresti voler guardare questa domanda .

Altri suggerimenti

È illegale in entrambi, ma i compilatori C generalmente implementano un'estensione.Consulta questa risposta .

Esistono tre modi per la risoluzione del problema:

  1. Se la variabile a è la stessa in entrambi i file, è necessario dichiararla come extern in tutti i file tranne uno.La parola chiave extern dice al linker che questo nome si trova in un altro file.

  2. Puoi utilizzare la parola chiave static per limitare l'ambito della variabile a un file.In cui è dichiarato.

  3. Oppure puoi utilizzare uno spazio dei nomi senza nome.

Il compilatore g ++ è più rigoroso del compilatore gcc. Dipende anche dalla versione di gcc, potrebbe essere una versione successiva di gcc, ad esempio dalla 4.X in poi può dare lo stesso errore.

Utilizza extern per evitare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top