2012-04-26 30 views
8

Đây là ám chỉ đến the structure for information about a file inode:Tại sao các trường trong `struct stat` có tên là st_something?

dev_t  st_dev;  /* ID of device containing file */ 
ino_t  st_ino;  /* inode number */ 
mode_t  st_mode; /* protection */ 
nlink_t  st_nlink; /* number of hard links */ 
uid_t  st_uid;  /* user ID of owner */ 
gid_t  st_gid;  /* group ID of owner */ 
dev_t  st_rdev; /* device ID (if special file) */ 
off_t  st_size; /* total size, in bytes */ 
time_t  st_atime; /* time of last access */ 
time_t  st_mtime; /* time of last modification */ 
time_t  st_ctime; /* time of last status change */ 
blksize_t st_blksize; /* blocksize for filesystem I/O */ 
blkcnt_t st_blocks; /* number of blocks allocated */ 

Tôi chỉ tìm kiếm cho bất kỳ loại câu trả lời thực sự. Tôi nhận thấy tất cả các trường bắt đầu bằng st_ và không thể tìm thấy giải thích tốt trên Internet.

+2

Để cho biết rằng chúng chứa dữ liệu 'stat'. –

Trả lời

15

Điều này quay trở lại một chặng đường dài, tất cả các cách để các phiên bản C đầu tiên. Họ không có một bảng biểu tượng riêng biệt cho các thành viên cấu trúc, các tên đã được thêm vào bảng ký hiệu toàn cầu. Với sự ô nhiễm không gian tên toàn cầu khó chịu rõ ràng gây ra. Cách giải quyết cũng giống như cách bạn sử dụng trên enums ngày hôm nay, hãy thêm tiền tố cho họ bằng một vài chữ cái để tránh va chạm tên.

Đó là loại hồ sơ lịch sử. Khi bạn thấy cấu trúc có các tên thành viên này, bạn biết đó là .

0

Tôi giả định rằng đó là quy ước đặt tên để khi bạn thấy st _..., bạn biết rằng đó là một phần của cấu trúc stat (bắt đầu bằng st).

+0

Tôi không nghĩ rằng nó sẽ được đơn giản nhưng nó xuất hiện như vậy, cảm ơn. – joethecoder

4

Ngoài câu trả lời của Hans, tôi nghĩ điều va chạm tên vẫn còn là thực tế. Mặc dù với các trường C struct hiện đại không nằm trong không gian tên chung mà chúng có thể xung đột với các định nghĩa macro.

Đây là một trong những lý do khiến mọi người thường sử dụng chữ thường cho macro và chữ thường cho các số nhận dạng khác, nhưng rất tiếc là không phải lúc nào cũng có thể. Bản thân thư viện C có các macro ở dạng chữ thường: về cơ bản mọi hàm trong thư viện có thể có một đối tác macro "quá tải" hàm cho mục đích tối ưu hóa. Trong ví dụ của bạn, bạn có thể dễ dàng tưởng tượng trong C (POSIX, bất cứ điều gì) xuất hiện một hàm blksize. Nếu không có tiền tố st_ cho các thành viên stat một ngày bạn muốn quá tải chức năng đó, bạn sẽ gặp rắc rối.

Với C11 và các macro loại chung của nó sử dụng _Generic các macro như vậy sẽ còn phổ biến hơn. Vì vậy, nếu bạn đang thiết kế một thư viện sẽ được sử dụng trong rất nhiều mã mà bạn không có bàn tay về cách các định danh được chọn, bạn vẫn còn tốt hơn với quy ước đặt tên như vậy.

Tất cả điều này không chỉ áp dụng cho struct thành viên, mà còn áp dụng cho tên và biến thông số của các hàm inline.

+1

Một ví dụ là các macro như '#define st_atime st_atim.tv_sec', làm cho' st_atime' trở thành một tên toàn cục không tôn trọng các quy tắc phạm vi. – musiphil

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