Ho cercato di utilizzare extern per utilizzare la variabile che è stata precedentemente definita.la variabile extern causa l'errore a più definizioni
Non ho usato extern prima e ora ho bisogno di usarlo per definire variabili solo una volta e li usa in più file
ho scritto versione ridotta di codice per questa domanda. Ho quattro file
lib.h
#ifndef LIB_H
#define LIB_H
#include <iostream>
namespace lib {
extern bool initialized;
bool initialized = false;
static void isInit(char* parent) {
std::cout << "Library for [" << parent << "] initialized? " << (::lib::initialized ? "yes" : "no") << "\n";
}
} // namespace lib
#endif
vehicle.h
#ifndef _VEHICLE_H
#define _VEHICLE_H
#include <string>
class Vehicle {
public:
Vehicle(const std::string& manufacturer,
const std::string& model,
int year);
std::string manufacturer;
std::string model;
int year;
};
#endif
In seguito è la realizzazione di file di vehicle.h chiamato vehicle.cpp
#include "vehicle.h"
#include "lib.h"
Vehicle::Vehicle(const std::string& manufacturer,
const std::string& model,
int year) :
manufacturer(manufacturer),
model(model),
year(year) {
::lib::isInit("Vehicle");
}
principale .cpp
#include "vehicle.h"
#include "lib.h"
int main(int argc, char** argv) {
::lib::isInit("main");
::lib::initialized = true;
::lib::isInit("main");
Vehicle vehicle("Toyota", "Corolla", 2013);
return 0;
}
Sto usando g ++
g++ -Wno-write-strings main.cpp vehicle.cpp -o bin/main.cpp.bin
ottengo seguenti errori:
/tmp/cclVpsgT.o:(.bss+0x0): multiple definition of `lib::initialized'
/tmp/ccmJKImL.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Ho controllato l'output di:
g++ -Wno-write-strings main.cpp vehicle.cpp -E
definizione multipla si verifica ogni volta lib.h è incluso.
Le mie domande sono:
- Perché lib.h incluso più volte quando definire guardia c'è
- Come definirei 'extern' variabile e inizializzare nello stesso file (dal momento che è utilizzato in lo stesso file in seguito)
non c'è modo di farlo nello stesso file? – abumusamq
@ mkhan3189: La risposta alla seconda domanda risponde alla Q nel tuo commento? –
Sì, lo fa :) contrassegnando questo come risposta poiché questo risponde alla mia domanda. Credo che non ci sia modo di inizializzare nello stesso file poiché è esterno. – abumusamq