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 ???? :))