This is in reference to the structure for information about a file inode:
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 */
I'm just looking for any type of answer really. I noticed all fields begin with st_
and can not find a good explanation on the Internet.
This goes back a long way, all the way to the first C versions. They didn't have a seperate symbol table for structure members, the names were added to the global symbol table. With the obvious nasty global namespace pollution that causes. The workaround was the same one you use on enums today, prefix them with a couple of letters to avoid the name collisions.
It's sort of a historical record. When you see a struct with these kind of member names, you know it is old.
In addition to Hans' answer, I think name collision thing is still of actuality. Even though with modern C struct
fields are not in the global name space they can conflict with macro definitions.
This is one of the reasons that everybody normally uses upper case for macros and lower case for other identifiers, but unfortunately this is not always possible. The C library itself has macros that are in lowercase: basically every function in the library may have a macro counterpart that "overloads" the function for optimization purposes. In your example, you may easily imagine in C (POSIX, whatever) appearing a function blksize
. If there would be no st_
prefix for the stat
members one day you'd want to overload that function, you would be in trouble.
With C11 and its type generic macros that use _Generic
such macros will be even more common. So if you are designing a library that is to be used in a lot of code where you don't have hands on how the identifiers are chosen, you'd are still better of with such a naming convention.
All of this not only applies to struct
members, but also to parameter names and variables of inline
functions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With