2012-03-14 65 views
9

Tôi có một số mã trải rộng trên ba tệp và tôi muốn sử dụng tệp "gloabls" thứ tư để lưu trữ một số hằng số vật lý chẳng hạn như giá trị của pi. Điều này sẽ tránh các định nghĩa lặp lại của pi = 4*atan(1.0). Sau khi chọc xung quanh, những gì tôi đã cố gắng là tạo một tập tin toàn cầu tiêu đề:C++ Biến toàn cầu trên nhiều tệp

/*globals.h*/ 
extern double g_pi; 

và một tập tin cpp toàn cầu:

/*globals.cpp*/ 
#include "math.h" 
#include "globals.h" 
double g_pi = 4*atan(1.0); 

Sau đó, tôi bao gồm các tập tin trong các tập tin chính của tôi:

/*mainFile.cpp*/ 
//Include math and other libraries 
#include globals.h" 
int main() { 
/* 
.... 
*/ 
double x = 2*g_pi 
/* 
.... 
*/ 
} 

Điều này mang lại cho tôi lỗi tham chiếu không xác định đối với g_pi. Tôi đang sử dụng một trình biên dịch g ++ trên Ubuntu. Hy vọng rằng nó là một sửa chữa đơn giản! Đề xuất của bạn được đánh giá cao. Nếu cần thêm chi tiết, tôi sẽ vui lòng cung cấp chúng.

+0

Sự cố có thể nằm trong cách bạn xây dựng tệp thi hành, vì vậy bạn nên thêm bất kỳ điều gì bạn sử dụng để thực hiện điều đó cho câu hỏi của mình (dòng lệnh Makefile, g ++ ...). – alexisdm

+0

Bạn có thể đưa vào lệnh chính xác mà bạn thực thi để biên dịch không? Và thông báo lỗi chính xác? – JaredC

Trả lời

12

Bạn chỉ có thể sử dụng M_PI từ phần bao gồm (cũng có các hằng số khác).

Chỉnh sửa: thiết lập của bạn là chính xác. Tôi có một ví dụ minmal làm việc:

globals.h

extern double g_tst; 

globals.cpp

#include "globals.h" 
double g_tst = 4.0; 

main.cpp

#include "globals.h" 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
fprintf (stderr, "g_tst = %lf \n", g_tst); 
return 0; 
} 

Vấn đề là trong vòng buildsystem bạn

Xem wikipedia

1

g_pi musst không được khai báo bên ngoài trong một đơn vị dịch. Bạn có thể sử dụng một #define nhỏ cho điều này

trong globals.cpp

#define MY_EXTERN_CPP 

trong /*globals.h

#ifdef MY_EXTERN_CPP 
    #define MY_CONFIGURATION_EXTERN 
#else 
    #define MY_CONFIGURATION_EXTERN extern 
#endif 

MY_CONFIGURATION_EXTERN double g_pi; 

nên g_pi sẽ extern trong tất cả các đơn vị dịch bạn bao gồm nó ngoại trừ globals.cpp

+0

oh, tôi chỉ thấy đây không phải là vấn đề của bạn :-) – Smittii

2

Thứ tự liên kết có thể là vấn đề. Cố gắng liên kết tệp đối tượng chung dưới dạng tệp cuối cùng.

+1

Không thể là vấn đề. Trình liên kết _must_ xử lý bất kỳ thứ tự nào, vì C++ cho phép sử dụng hai chiều các hình cầu. Ví dụ. A.cpp định nghĩa 'int a' và sử dụng' b', trong khi B.cpp sử dụng 'a' và định nghĩa' int b'.Điều này phải liên kết, và rõ ràng là một tập tin phải đặt trước cái kia trong thứ tự liên kết. – MSalters

6

Tôi nghĩ rằng vấn đề là bạn đã có #include gobals.h thay vì #include globals.h. Điều này sẽ cung cấp cho bạn các tài liệu tham khảo không xác định bởi vì nó không chèn globals.h. Trình biên dịch trước C++ không thất bại khi nó không thể tìm thấy tệp tiêu đề. Thay vào đó bạn nhận được một thông báo tham chiếu không xác định tại biên dịch.