Defect Report #126

Submission Date: 03 Dec 93
Submittor: WG14
Source: Ron Guilmette
ANSI/ISO C Defect Report #rfg33:
Subject: What does ``synonym'' mean with respect to typedef names?
Given the declarations:
typedef int *IP;
const IP object;

what is the type of object?
Subclause 6.5.6 says:
A typedef declaration does not introduce a new type, only a synonym for the type so specified.
At least one person has wondered aloud about the true meaning of this rule.
Note that if the name IP in the above example is expanded as if it were a mere macro, then the type of object would be (const int *). But essentially all existing implementations act as if there were some sort of magical parsing precedence (or extra parenthesization) which causes the IP (when used in the second line of the example above) to be treated as a single type, to which the const qualifier is applied (after the fact) thus resulting in object having type (int * const) rather than (const int *).
While this treatment is well known to experienced implementors and users, it appears that the C Standard doesn't really explain it very well (or very precisely). I consider this to be a defect in the C Standard, worthy of the Committee's attention.
A typedef introduces a name for a type. This is not a macro, and the type must indeed be ``magically parenthesized.'' In
typedef int *ip;
ip x;
const ip y;

the type of x is pointer to int, and the type of y is const pointer to int. This is exactly analogous to the fact that
ip x1, x2;
declares both x1 and x2 as having the type pointer to int, and is not to be read as
int *x1, x2;
Previous Defect Report < - > Next Defect Report