Где лязг заголовочный файл? - PullRequest
1 голос
/ 31 марта 2020

Я копался в некоторых C внутренних органах и нашел следующую строку из stddef.h clang (расположенной в /usr/lib/llvm-11/lib/clang/11.0.0/include/):

typedef __WCHAR_TYPE__ wchar_t;

Это отличается от того, что я нашел в g cc s stddef.h (находится в /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

В g cc s stddef.h, __WCHAR_TYPE__ четко определяется как int, но в кланге stddef.h нигде не упоминалось __WCHAR_TYPE__, кроме этой одной строки. Итак, я решил определить макрос сам, чтобы узнать, где был определен макрос. Я скомпилировал следующий файл с помощью clang:

#define __WCHAR_TYPE__ x

И я получил следующее предупреждение:

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

Казалось бы, есть какой-то «встроенный» заголовок, который определяет макрос __WCHAR_TYPE__, и этот заголовок будет казаться реальным файлом, судя по тому, что был указан номер строки. Тем не менее, я рекурсивно нашел #define __WCHAR_TYPE__ int в /usr и не смог найти ничего, кроме заголовочных файлов g cc. Итак, мой вопрос, является ли этот «встроенный» заголовочный файл реальным файлом, и если да, где я могу его найти?

1 Ответ

3 голосов
/ 31 марта 2020

Это не настоящий файл; В clang встроено несколько предопределенных макросов.

Вы можете увидеть все эти макросы, выполнив clang -dM -E foo.c, где foo.c - любой файл (он может быть даже пустым). Среди списка, который я видел

#define __WCHAR_TYPE__ int

В источнике Clang все это сделано в clang/lib/Frontend/InitPreprocessor.cpp.

g cc на самом деле это тоже есть ( run gcc -dM -E foo.c; clang и gcc в основном поддерживают одинаковые параметры командной строки). #define в <stddef.h>, вероятно, просто в качестве резервной копии.

...