Defect Report #050
Submission Date: 24 Feb 93
Submittor: Project Editor (P.J. Plauger)
Source: C. Breeus
Question 1
Subclause 6.1.3.4 says that the type of a wide character constant 
is wchar_t, and subclause 6.1.4 says the type of a wide character 
string is array of wchar_t.
Subclause 7.1.6 says the typedef name wchar_t must be defined 
in <stddef.h>.
Question: When a compiler sees a literal of the form L'...' 
or L"..." must it not check that
-  The name wchar_t is visible at that place.
-  The name is a typedef name. It could be redefined in an inner 
scope.
-  It is a typedef for an integral type. Again, it could be redefined.
And then, take that integral type as the meaning of wchar_t. 
I suppose it cannot just hope for the best and take a type that makes 
it feel good.
Response
A similar issue was explained in response to Defect Report #017 Question 
7, regarding size_t. The relevant citation here is from subclause 
6.1.3.4, page 29, lines 36-37:
A wide character constant has type wchar_t, an integral 
type defined in the <stddef.h> header.
The intent of this sentence is to note that a wide character constant 
has an integral type. That integral type is the same integral type 
used to define wchar_t in the header <stddef.h>. The sentence 
imposes no requirement that this particular definition of wchar_t 
be in scope wherever you write a wide character constant. It certainly 
does not suggest that the translator should honor any other definition 
of wchar_t that may be in scope, as the type for a wide character 
constant.
Rather, the sentence suggests that the translator knows what integral 
type to assign to a wide character constant. The implementation further 
knows to define wchar_t within the header <stddef.h> as 
having that same integral type. Thus, the program has a way of obtaining 
a name for this type, if it chooses - by including the header 
<stddef.h>. But it need not invoke that mechanism just to assist 
the translator.
It is an unfortunate, but widespread, practice within the C Standard 
to use abbreviated language for describing some types. Thus, subclause 
6.1.4, page 31, lines 5-6 say:
for wide string literals, the array elements have type wchar_t, 
...
instead of the more long winded (but clearer):
for wide string literals, the array elements have the same type 
used to define wchar_t in the header <stddef.h>, ...
We feel the usage is sufficiently uniform that the meaning intended 
by  the Committee is sufficiently clear, even as we acknowledge that 
the words can be (and have been) misread.
So to put the matter crassly, the translator does ``just 
hope for the best and take a type that makes it feel good,'' as 
you conjectured.
Previous Defect Report
< - > 
Next Defect Report