2013-01-14 37 views
5

Các mã sau đây làm việc một cách chính xác:biến cục bộ bên ngoài cho những biến toàn cục bên trong namespace

file1.cpp

//global variable 
int g_myvar1 = 5; 

file2.cpp

int myfunc() 
{ 
    extern int g_myvar1; 
    g_myvar1++ 
} 

Làm thế nào tôi có thể làm file2.cpp nếu file1 .cpp như sau:

file1.cpp

namespace myns 
{ 
    //global variable 
    int g_myvar1 = 5; 
} 

CHÚ THÍCH 1, phần sau đây cung cấp lỗi biên dịch về việc sử dụng không hợp lệ tên "đủ điều kiện" của GCC 4.7 ". Tôi đã thử 'sử dụng không gian tên' mà không có may mắn.

int myfunc() 
{ 
    extern int myns::g_myvar1; 
    g_myvar1++ 
} 

NOTE2, Công trình sau đây, nhưng tôi chỉ tìm định nghĩa biến cục bộ.

namespace myns 
{ 
    //global variable 
    extern int g_myvar1; 
} 
int myfunc() 
{ 
    myns::g_myvar1++ 
} 

Trả lời

3

Sử dụng using:

void f() 
{ 
    using myns::g_myvar1; 

    ++g_myvar1; 
} 

Bạn đã tuyên bố các biến (với extern từ khóa) trong .h tập tin trong một không gian tên myns, và xác định chúng trong .cpp tập tin. Và bao gồm các tập tin tiêu đề bất cứ nơi nào bạn muốn sử dụng các biến.

+1

+1 cho cách sử dụng mới của việc sử dụng từ khóa. Nhưng điều này vẫn cần khai báo "namespace mynm {extern int g_myvar1;}" trước void f() – Yousf

+0

@Yousf: Có, tốt hơn là * khai báo * chúng trong tệp '.h', và * define * chúng trong'. tệp cpp'. – Nawaz

1

Đặt không gian tên với khai báo extern trong tệp tiêu đề và bao gồm tệp tiêu đề đó trong tất cả các tệp nguồn cần biến đó.

+0

Tôi biết đây là giải pháp tốt nhất, nhưng tôi đang tìm kiếm một giải pháp không cần điều này bao gồm. – Yousf

+0

@Yousf Trong C và C++ mọi thứ phải được khai báo trước khi chúng được sử dụng, nó đơn giản như vậy. Nếu bạn không có một số loại khai báo không gian tên hoặc dữ liệu bên trong nó, trình biên dịch sẽ không biết về các tên định danh đó. –

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