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