2010-08-15 22 views
5

Tôi đang cố gắng chia sẻ cùng một biến giữa hai tệp .cpp, chúng bao gồm cùng một tệp .h.vấn đề với biến toàn cầu được chia sẻ giữa các nguồn (tôi đang sử dụng bao gồm bảo vệ)

Nhưng tôi đang gặp lỗi liên kết, cho tôi biết rằng tôi có nhiều định nghĩa. Mà tôi thấy lúng túng, vì tôi đang sử dụng bao gồm bảo vệ

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int main(){ 
    shared_int = 5; 
    printVal(); 
    return 0; 
} 


//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 


int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

Tôi comping như

g++ shared.cpp -c;g++ main.cpp shared.o 
shared.o:(.bss+0x0): multiple definition of `shared_int' 
/tmp/cci8w8Am.o:(.bss+0x0): first defined here 
collect2: ld returned 1 exit status 

nhờ

Cập nhật: Công việc vẫn doesnt 'extern', nhưng bây giờ tôi có được tham chiếu không xác định Đây là các tệp được cập nhật

//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
//extern "C" int shared_int;//i've tried both 
extern int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 

int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int main(){ 
    int shared_int = 5; 
    printVal(); 
    return 0; 
} 

Đây là cách tôi biên dịch

g++ main.cpp shared.o 
shared.o: In function `printVal()': 
shared.cpp:(.text+0x6): undefined reference to `shared_int' 
collect2: ld returned 1 exit status 
+1

Câu trả lời đã được đưa ra bởi Greg, nhưng hãy chắc chắn để hiểu sự khác biệt giữa một tuyên bố và một định nghĩa. Đó là một sự phân biệt quan trọng sẽ giúp bạn hiểu được thông điệp của trình biên dịch tốt hơn và ngữ nghĩa chung của mã. – Nick

+0

Mã cập nhật của bạn thêm 'extern" C "' (cái gì đó khá khác với những gì tôi đề xuất trong câu trả lời của tôi), và không giới thiệu một định nghĩa nào cả. Hãy thử những gì tôi đề xuất trong câu trả lời của tôi để thay thế. –

+0

@greg Hewgill. Tôi đã thử điều đó, cùng một lỗi liên kết.Cảm ơn – monkeyking

Trả lời

15

Việc kê khai trong hồ sơ tiêu đề của bạn cần một extern:

extern int shared_int; 

Sau đó, bạn sẽ cần một ví dụ thực tế của định nghĩa trong một C++ tập tin (ví dụ như trong shared.cpp):

int shared_int; 

Các nhân viên bảo vệ bạn đang sử dụng ở đây là thực tiễn tốt, nhưng sẽ không có bất kỳ ảnh hưởng nào trong tình huống này. Trình bảo vệ bao gồm ngăn tệp tiêu đề được bao gồm nhiều lần trong cùng một tệp nguồn. Tình huống như vậy thường không xảy ra trừ khi bạn có các tệp tiêu đề gián tiếp được bao gồm từ các tệp tiêu đề khác.

+0

+1 Greg. Tôi cũng nhận thấy rằng @monkeyking đang trộn các tệp tiêu đề C .h với trình biên dịch C++. Đó không phải là một thực hành rất tốt, vì vậy tôi sẽ chỉ ra rằng có lẽ tốt hơn nếu bạn buộc biểu tượng được xuất khẩu như một biểu tượng C để tránh các vấn đề mangling mang tên. Chỉ cần xác định biến trên shared.h như: extern "C" int shared_int; – karlphillip

+3

@karlphillip: Không có thứ gì như "tệp tiêu đề C" - các tệp tiêu đề được biên dịch với bất kỳ trình biên dịch nào # bao gồm chúng. Tên '.h' hoàn toàn có thể chấp nhận được cho C++. Một số người có thể sử dụng '.hpp' hoặc' .hxx' nhưng đó chỉ là phong cách và không có ý nghĩa gì cả. –

0

Thứ nhất, hình cầu không phải là một ý tưởng hay và phải tránh xa hết mức có thể. Giả sử rằng trong tình huống cụ thể của bạn, nó là bắt buộc theo bất kỳ lý do gì, từ quan điểm OO thuần túy, tôi sẽ tiếp cận theo cách sau:

a) Xác định biến toàn cục trong một tệp nói a.cpp (cũng nếu biến có thể được nhúng vào trong một không gian tên)

b) Viết được các chức năng/bộ trong a.cpp

c) Truy cập biến toàn cầu trong a.cpp sử dụng các chức năng get/set.

Bằng cách này, bạn sẽ có một thiết kế rất mô-đun với giao diện được xác định rõ.

-1

bạn rất sớm:

//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
//extern "C" int shared_int;//i've tried both 
extern int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 

int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int shared_int = 0; // definition (extern ... is declaration) 
        // initialize force definition 

int main(){ 
    shared_int = 5; 
    printVal(); 
    return 0; 

}

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