2013-06-01 37 views
6

Theo wikipedia:Biến ngoài nằm trong một hàm?

http://en.wikipedia.org/wiki/External_variable

Một biến bên ngoài cũng có thể được khai báo bên trong một hàm.

Mục đích của biến ngoài được khai báo trong một hàm là gì? Nó có phải là tĩnh quá không?

+0

các bài đăng này có liên quan: http://stackoverflow.com/questions/16459422/why-does-declaring-an-extern-variable-inside-main-works-but- không xác định-nó-in và http://stackoverflow.com/questions/9686198/what-is-the-use-of-declaring-a-static-variable-as-extern-inside-a-function – taocp

Trả lời

2

Sự khác biệt duy nhất giữa tuyên bố một biến bên ngoài ở phạm vi không gian tên:

extern int x; 

void foo() { 
    cout << x; 
} 

và tuyên bố nó ở phạm vi chức năng:

void foo() { 
    extern int x; 
    cout << x; 
} 

là trong trường hợp sau, xchỉ hiển thị bên trong hàm.

Tất cả những gì bạn đang làm là thắt chặt hơn nữa phạm vi của tuyên bố extern.


Dưới đây là một ví dụ tương tự như sử dụng không gian tên:

Tại phạm vi không gian tên:

#include <string> 
using std::string; 

void foo() { 
    string str1; 
} 

string str2; // OK 

Tại phạm vi chức năng:

#include <string> 
void foo() { 
    using std::string; 
    string str1; 
} 

string str2; // Error - `using` not performed at this scope 
1

Tuyên bố bên ngoài đi vào bên trong một hàm. Nó chỉ đơn giản có nghĩa là không có chức năng nào khác có thể thấy biến.

void func() 
{ 
    extern int foo; 
    foo ++; 
} 


void func2() 
{ 
    foo--;  // ERROR: undeclared variable. 
} 

Trong một tập tin nguồn:

int foo;  // Global variable. Used in the other source file, 
      // but only in `func`. 

Nó chỉ là một cách để "cô lập" một biến, vì vậy nó không vô tình làm quen ở những nơi mà nó không phải là nghĩa được sử dụng.

+0

Tôi không 't nhận được làm thế nào điều này là khác nhau hơn so với một biến địa phương thường xuyên ... Làm thế nào để 'extern' làm cho nó khác nhau? – 0x499602D2

+0

@ 0x499602D2 'extern' cho trình biên dịch biết 'biến này được định nghĩa ở một nơi khác'. Nó không thực sự xác định bất cứ điều gì, nó chỉ tuyên bố. –

+0

@ 0x499602D2: Nó không xác định một biến; nó _declares_ tồn tại ở nơi khác. Do đó, không phải là "địa phương". –

4

Nó cho phép để hạn chế quyền truy cập vào một thế giới đối với một số phạm vi:

int main() 
{ 
    extern int x; 
    x = 42; //OKAY 
} 

void foo() 
{ 
    x = 42; //ERROR 
} 

int x; 
0

Các văn bản liên quan đến một tổ chức phi -defin ing khai báo của một biến bên ngoài bên trong hàm. Extern định nghĩa chức năng bên trong là bất hợp pháp.

Vì vậy, một khai báo không xác định của một biến bên ngoài bên trong hàm chỉ đơn giản có nghĩa là bạn muốn sử dụng biến đó bên trong hàm đó. Biến tự nó phải là một biến toàn cầu được định nghĩa ở nơi khác. Về cơ bản, nếu bạn không cần truy cập vào biến toàn cầu đó (được định nghĩa ở nơi khác) trong toàn bộ đơn vị dịch và chỉ cần nó bên trong hàm đó, bạn nên khai báo nó cục bộ một cách hoàn hảo.Bằng cách đó bạn không gây ô nhiễm không gian tên toàn cầu với các mã định danh không có nhu cầu chức năng khác.

+0

Nếu nó không thể được sử dụng ở bất kỳ nơi nào khác, có thể lập luận rằng nó có thể là biến tĩnh cục bộ không? Có sự khác biệt nào không? – user997112

+0

@ user997112: Tôi không chắc chắn ý bạn là gì bởi "nó không thể được sử dụng ở bất cứ nơi nào khác". Trên thực tế, biến * có thể * được sử dụng hoàn toàn ở bất kỳ đâu. (Nó là một biến toàn cầu, sau khi tất cả.) Nó chỉ là nó sẽ yêu cầu một tuyên bố riêng biệt ở những nơi khác là tốt. – AnT

+0

Trong câu trả lời ở trên có vẻ như biến không thể được sử dụng bên ngoài hàm mà nó được khai báo bên ngoài? – user997112

0

Từ khóa extern cho biết rằng số nhận dạng có liên kết bên ngoài. Điều này có nghĩa rằng nó được liên kết với cùng một tên ở bất cứ nơi nào khác nó được khai báo với liên kết bên ngoài. Đó là, các trường hợp khác nhau của tên ở những nơi khác nhau đề cập đến cùng một đối tượng.

Khai báo số nhận dạng bên trong một khối (bao gồm khối xác định hàm) cho phạm vi chặn. Phạm vi của trường hợp đó của số nhận dạng kết thúc ở cuối khối.

Kết hợp extern với phạm vi chặn cho phép chức năng xem mã định danh bên ngoài mà không làm lộn xộn không gian tên của các chức năng khác. (Tuy nhiên, đó thường là hành vi xấu.)

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