Вопроса, как условная компиляция в заголовочных файлах системы (такие как <sys/types.h>
) контролируют процесс компиляции смущала меня в течение длительного времени Например, вот фрагмент коды один общие ЬурейеЙ в <sys/types.h>
:Условная компиляция в заголовочных файлах система
# if __WORDSIZE == 64
typedef long int int64_t;
# elif __GLIBC_HAVE_LONG_LONG
__extension__ typedef long long int int64_t;
# endif
# endif
Тем не менее, если __WORDSIZE == 64
, то мы определим тип int64_t
как один псевдоним long int
, но мне интересно, что там, где я могу найти определение __WORDSIZE
.
- Был ли макрос
__WORDSIZE
определен в статическом файле? Если так, как этот файл получить? - Или мы передаем макросы препроцессора компилятору?
- Или компилятор знает, на какой машине он работает точно? Но откуда он это знает?
В конце концов, как я могу написать один заголовочный файл, который может достигнуть следующего намерения:
#if the machine is 64-bit
typedef unsigned long int KEY_TYPE
#elif the machine is 32-bit
typedef unsigned long long int KEY_TYPE
#endif
, который контролирует параметры компилятора? Вы имеете в виду, что компилятор предоставит __WORDSIZE другое определение accordint для того, какой компьютер он установлен? но как компилятор знает об особенностях машины? Нужно ли нам предоставлять этот вариант функции в человеческом плане? Но я не помню, что я это делаю, когда устанавливаю gcc-компилятор на своей машине. –
На моих машинах я чаще всего использую GCC. Я могу использовать 'gcc -m64' для генерации 64-битного объектного кода и' gcc -m32' для генерации 32-битного кода, каждый раз запуская один и тот же компилятор. Если я попытаюсь использовать компилятор для Mac OS X на машине Linux, он не запускается и не наоборот, так что да, компилятор знает, на каком типе машины он установлен. Компилятор, который построен как 64-битный двоичный файл, не будет запускаться на машине, которая поддерживает только 32-разрядные двоичные файлы. Итак, вы (человек, выполняющий компилятор) управляете параметрами компилятора, хотя у компилятора будут значения по умолчанию, которые он использует, если вы не переопределите их. –
Кстати, я также хочу знать взаимосвязь между файлами заголовков системы и файлами заголовков gcc-компилятора. Есть ли взаимозависимость между ними? и кто создает файлы системных заголовков? Выполняет ли процесс установки ОС Linux всегда создание файлов системных заголовков? –