Thursday, 9 June 2011

Name space in C

Thật ra mấy hôm nay ngồi đọc lại quyển Illustrating C mới ngỡ ra là mình đọc thiếu 1 chương >:)
Trong này có 1 bài viết về Name Space.
Không biết có liên quan đến namespace khai báo trong mỗi file C++ không nhưng khái niệm này sẽ khá mới mẻ với các bạn.

Thử ví dụ sau:
http://pastebin.com/JAGQgrKR

nhận thấy rằng cùng là biến c nhưng ta declare nó nhiều lần, mỗi lần 1 kiểu. Đầu tiên là int, sau đó là float rồi char và cuối cùng là char *(array). Chương trình chạy ngon lành và không có lỗi hay warning gì hết. Bởi trong cùng 1 level of nesting block (Khối lệnh lồng vào nhau) thì các biến chia sẻ cùng 1 name space (dịch thô là không gian tên). MỖi khối lệnh được đánh dấu bắt đầu bằng { và kết thúc bằng }




Bởi thế, trong ví dụ tớ đưa ra, ở mỗi level, tên c được sử dụng với các kiểu khác nhau. Hãy thử 1 phản ví dụ:


compile sẽ thấy báo error: conflicting types for 'c'
#include

int main(int argc, char **argv)
{
int c = 4;
printf("1_%d\n",c);

char c = 'c';
printf("2_%c\n",c);


return 0;
}


Để hiểu rõ thê ta làm cái ví dụ nữa:


#include

int main(int argc, char **argv)
{
int c = 4;
printf("1_%d\n",c);
{
printf("2_%d\n",c);
char c = 'c';
printf("3_%d\n",c);
printf("4_%c\n",c);
}
printf("5_%d\n",c);

return 0;
}


kết quả nhận đc là:

1_4
2_4
3_99
4_c
5_4


Ví dụ này cho thấy rõ là khi vào 1 block level khác, biến c không phải bị xóa đi , tên c khi đó vẫn lấy từ không gian ngoài, sau khi declare (khai báo) mới, nó mới dùng tên c trong namespace level trong. ra khỏi block nó lại dùng c của không gian ngoài.

Có ai hiểu t nói cái gì ko ???? :))

4 comments:

  1. đang đọc thì buồn ị

    ReplyDelete
  2. Cái này trong C gọi là "Scope" tạm dịch là phạm vi hoạt động của biến. Biến bên ngoài sẽ bị "che" bởi biến bên trong và 2 biến này là hoàn toàn khác nhau về mặt logic (chỉ giống tên). Còn cái namespace hình như C không định nghĩa.

    ReplyDelete
  3. à thêm 1 cái là : biến toàn cục có file scope (tức là phạm vị hoạt động là bên trong file), biến cục bộ có block scope (phạm vị hoạt động chỉ bên trong khối lệnh chứa nó).

    ReplyDelete
  4. Khái niệm "scope" của 1 đối tượng là vùng trong chương trình mà các câu lệnh có thể truy cập hay tác động vào nó. Và khái niệm scope thừa nhận rầwng đối tượng đó phải không bị "ẩn". Ví dụ trong bài viết là về việc biến i ở ngoài khối lệnh bị biến i bên trong làm ẩn đi. Bởi thế bài viết trên có thể gọi là 1 chú ý trong scope của object (variable) chứ ko hẳn gọi là "scope"

    ReplyDelete