I was digging around in some C internals, and I found the following line from clang's stddef.h
(located in /usr/lib/llvm-11/lib/clang/11.0.0/include/
):
typedef __WCHAR_TYPE__ wchar_t;
This is different from what I found in gcc's stddef.h
(located in /usr/lib/gcc/x86_64-pc-linux-gnu/10.0.1/include/
):
#ifndef __WCHAR_TYPE__
#define __WCHAR_TYPE__ int
#endif
#ifndef __cplusplus
typedef __WCHAR_TYPE__ wchar_t;
#endif
In gcc's stddef.h
, __WCHAR_TYPE__
is clearly defined as an int
, but in clang's stddef.h
there was no mention of __WCHAR_TYPE__
anywhere except for that one line. So, I decided to define the macro myself in order to find out where the macro was defined. I compiled the following file with clang:
#define __WCHAR_TYPE__ x
And, I got the following warning:
file.c:1:9: warning: '__WCHAR_TYPE__' macro redefined [-Wmacro-redefined]
#define __WCHAR_TYPE__ x
^
<built-in>:85:9: note: previous definition is here
#define __WCHAR_TYPE__ int
It would seem that there's some sort of "built-in" header that defines the __WCHAR_TYPE__
macro, and that header would appear to be an actual file, judging by the fact that a line number was provided. However, I recursively grepped for #define __WCHAR_TYPE__ int
in /usr
and I couldn't find anything outside of gcc's header files. So, my question is, is this "built-in" header file an actual file, and if so, where can I find it?
It's not an actual file; Clang has a number of predefined macros built in.
You can see all these macros by doing clang -dM -E foo.c
where foo.c
is any file (it can even be empty). Among the list I saw
#define __WCHAR_TYPE__ int
In the clang source, this is all done in clang/lib/Frontend/InitPreprocessor.cpp.
GCC actually has it as well (run gcc -dM -E foo.c
. Clang and GCC mostly support the same command-line options). The #define
in <stddef.h>
is probably just there as a backup.