5

In C, if you declare a struct like:

struct point {
    int x, y;
};

you also have to use struct when referring to point, e.g.:

struct point p;  // declare p as struct point

because all struct, union, and enum names are in a distinct "tags" namespace. Yes, I know you can use a typedef to import a struct's tag name into the current scope:

typedef struct point point;
point p;         // don't need "struct" now

Clearly, a tags namespace isn't needed since C++ effectively auto-typedefs struct (and class) declarations.

My question is: does anybody know what Ritchie's rationale for using a separate tags namespace was? Why weren't struct names just put directly into the current scope so a typedef would be unnecessary?

His The Development of the C Language mentions structures, but nothing about the tags namespace.

Note that I’m really looking for a definitive answer, not speculation.

The only minor benefit is that you can have a struct and variable with the same name, e.g.:

struct stat stat;

To me, however, that's outweighed by ordinarily having to use struct all over the place if you don't use typedef.

For self-referential structures, you don't need the struct prefix either since in C++ you could do:

struct link;     // forward declare link
struct link {
    void *data;
    link *next;
};

That works just fine.


Note that I'm not asking about why a lot of Unix struct members have prefixes, e.g., sin_family, sin_port, sin_addr. Aside from already knowing the answer to that question, it's unrelated since that's about struct members whereas I'm currently asking about struct names in the tags namespace.

FYI: I've been programming in C on-and-off since the 1980s, so I know C. But I've never seen any explanation of Ritchie's rationale for the tags namespace.

2

0

Browse other questions tagged .