2010-09-19 32 views
5

Tôi đang cố gắng thiết kế thư viện chỉ tiêu đề, không may cần phải có biến tĩnh toàn cục (trong lớp hoặc trong không gian tên).Biến đổi tĩnh C++

Có cách nào hay giải pháp ưu tiên để có biến tĩnh toàn cầu trong khi vẫn duy trì thiết kế chỉ tiêu đề?

Mã là here

Trả lời

10

Có một vài tùy chọn. Điều đầu tiên mà tôi nghĩ đến là C++ cho phép các thành phần dữ liệu tĩnh của các mẫu lớp được xác định trong nhiều đơn vị dịch:

template<class T> 
struct dummy { 
    static int my_global; 
}; 

template<class T> 
int dummy<T>::my_global; 

inline int& my_global() {return dummy<void>::my_global;} 

Trình liên kết sẽ hợp nhất nhiều định nghĩa thành một. Nhưng inline một mình cũng có thể giúp đỡ ở đây và giải pháp này là đơn giản hơn nhiều:

inline int& my_global() { 
    static int g = 24; 
    return g; 
} 

Bạn có thể đặt chức năng inline này vào một tập tin header và bao gồm nó thành nhiều đơn vị dịch. C++ đảm bảo rằng tham chiếu được trả về bởi hàm inline này sẽ luôn luôn tham chiếu đến cùng một đối tượng. Đảm bảo rằng hàm có liên kết bên ngoài.

+2

+1 static cục bộ là cách dễ nhất với dữ liệu toàn cầu, đặc biệt vì tiêu chuẩn C++ 0x mới sẽ đảm bảo khởi tạo chính xác ngay cả trong ứng dụng đa luồng. –

+0

Tôi cũng nên thêm rằng biến thể thứ hai có nhược điểm - g được khởi tạo chỉ trong lần gọi đầu tiên của my_global. Do đó trình biên dịch sẽ chèn so sánh, nhảy và bảo vệ luồng vào mọi cuộc gọi - điều này sẽ làm cho các cuộc gọi chậm (có thể quan trọng trong trường hợp điểm vào thư viện). –

+0

@AlexEngy: Trong trường hợp này, đó là một int mà có lẽ sẽ được khởi tạo tĩnh mà không có chi phí cho thread-safty trong khởi tạo động. – sellibitze

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