Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are the fields in `struct stat` named st_something?

Tags:

c

struct

stat

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.

like image 582
joethecoder Avatar asked Apr 26 '12 00:04

joethecoder


2 Answers

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.

like image 118
Hans Passant Avatar answered Nov 10 '22 01:11

Hans Passant


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.

like image 43
Jens Gustedt Avatar answered Nov 10 '22 00:11

Jens Gustedt