2013-01-26 30 views
5

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)

Trả lời

8

Tại sao lib.h bao gồm nhiều lần khi xác định bảo vệ là có

01.

Bạn cần phải loại bỏ các định nghĩa:

bool initialized = false; 

Và đặt nó trong một và chỉ một tập tin nguồn.

Bao gồm bảo vệ ngăn chặn các tập tin tiêu đề tương tự từ việc bao gồm nhiều hơn một lần trong cùng một translation unit(TU) không trong các đơn vị dịch khác nhau.
Bạn xác định biến initialized trong tập tin tiêu đề mà được bao gồm trên đơn vị dịch khác nhau và sau đó mỗi TU có một biểu tượng mang tên initialized mà phá vỡ one definition rule.

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)

Nếu bạn muốn biến được sử dụng trong cùng một tập tin, tại sao làm cho nó extern? Bạn cần sử dụng extern khi bạn muốn chia sẻ cùng một biến trên các TU khác nhau.
Nếu bạn cần sử dụng nó ở phạm vi toàn cầu chỉ trong một TU, bạn nên đặt đơn giản vào một số unnamed namespace.

+0

không có cách nào để thực hiện điều đó trong cùng một tệp? – abumusamq

+0

@ 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? –

+0

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

Các vấn đề liên quan