Tôi đã cố gắng sử dụng extern để sử dụng biến được xác định trước đó.biến ngoài gây ra nhiều lỗi định nghĩa
tôi đã không sử dụng extern trước và bây giờ tôi cần phải sử dụng nó để xác định biến chỉ một lần và sử dụng chúng trên nhiều file
Tôi đã viết phiên bản thu nhỏ của mã cho câu hỏi này. Tôi có bốn 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
Tiếp theo là việc thực hiện các tập tin vehicle.h gọi 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");
}
chính .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;
}
Tôi đang sử dụng g ++
g++ -Wno-write-strings main.cpp vehicle.cpp -o bin/main.cpp.bin
tôi nhận được lỗi sau đây:
/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
Tôi đã kiểm tra đầu ra của:
g++ -Wno-write-strings main.cpp vehicle.cpp -E
nhiều định nghĩa xảy ra mỗi lib.h thời gian được bao gồm.
Câu hỏi của tôi là:
- Tại sao lib.h bao gồm nhiều lần khi xác định bảo vệ là có
- Làm thế nào tôi sẽ xác định 'extern' biến và khởi tạo nó trong cùng một tập tin (kể từ khi nó được sử dụng trong cùng một tập tin sau)
không có cách nào để thực hiện điều đó trong cùng một tệp? – abumusamq
@ mkhan3189: Câu trả lời cho câu hỏi thứ hai có trả lời câu hỏi trong bình luận của bạn không? –
Có, không :) đánh dấu câu trả lời này vì câu trả lời này không trả lời được câu hỏi của tôi. Tôi tin rằng không có cách nào để khởi tạo trong cùng một tập tin vì nó là extern. – abumusamq