Нужно ли мне компилировать заголовочные файлы в программе на C?

Иногда я вижу, как кто-то компилирует программу на Си так:

gcc -o hello hello.c hello.h

Как я знаю, нам просто нужно поместить заголовочные файлы в программу C, например:

#include "somefile"

и скомпилируйте программу на C: gcc -o hello hello.c.

Когда нам нужно скомпилировать заголовочные файлы или почему?

c gcc
40 голосов | спросил yuliu 2 J000000Tuesday13 2013, 06:57:54

4 ответа


0

Во-первых, в общем:

Если эти файлы .h действительно являются типичными заголовочными файлами в стиле C (в отличие от чего-то совершенно иного, что просто называется с расширением .h), то нет, нет причин «компилировать» эти заголовочные файлы независимо. Заголовочные файлы предназначены для включения в файлы реализации, а не для подачи в компилятор в качестве независимых единиц перевода.

Поскольку типичный заголовочный файл обычно содержит только объявления, которые можно безопасно повторять в каждой единице перевода, вполне ожидаемо, что «компиляция» заголовочного файла не будет иметь вредных последствий. Но в то же время ничего полезного не получится.

По сути, компилируем hello.h как отдельную единицу перевода, эквивалентную созданию вырожденного dummy.c файл, состоящий только из директивы #include "hello.h" и передающий эту dummy.c файл в компилятор. Он будет компилироваться, но не будет служить какой-либо значимой цели.


Во-вторых, специально для GCC:

Многие компиляторы будут обрабатывать файлы по-разному в зависимости от расширения имени файла. GCC имеет специальную обработку для файлов с расширением .h, когда они передаются компилятору в качестве аргументов командной строки. Вместо того, чтобы рассматривать его как обычный модуль перевода, GCC создает файл предварительно скомпилированного заголовка для этого .h файла.

Вы можете прочитать об этом здесь: http://gcc.gnu.org /onlinedocs/gcc/Precompiled-Headers.html

Таким образом, по этой причине вы можете видеть, что .h файлы передаются непосредственно в GCC.

ответил AnT 2 J000000Tuesday13 2013, 09:19:25
0

Хорошо, давайте поймем разницу между активным и пассивным кодом.

Активный код - это реализация функций, процедур, методов, то есть фрагментов кода, которые должны быть скомпилированы в исполняемый машинный код. Мы храним его в файлах .c и уверены, что нам нужно его скомпилировать.

Пассивный код не выполняется сам по себе, но ему нужно было объяснить различным модулям, как взаимодействовать друг с другом. Обычно файлы .h содержат только прототипы (заголовки функций), структуры.

Исключением являются макросы, которые формально могут содержать активные части, но вы должны понимать, что они используются на самой ранней стадии построения (предварительной обработки) с простой заменой. Во время компиляции макросы уже подставляются в ваш файл .c.

Другим исключением являются шаблоны C ++, которые должны быть реализованы в файлах .h. Но вот история, похожая на макросы: они подставляются на ранней стадии (создание экземпляров) и формально, каждый другой экземпляр - это другой тип.

В заключение, я думаю, что если модули сформированы правильно, мы никогда не должны компилировать файлы заголовков.

ответил Alexander Mihailov 2 J000000Tuesday13 2013, 07:36:09
0

Я думаю, что нам нужен предварительный процесс (возможно, НЕ вызывать компиляцию) заголовочного файла. Потому что, насколько я понимаю, на этапе компиляции файл заголовка должен быть включен в файл c. Например, в test.h у нас есть

typedef enum{
    a,
    b,
    c
}test_t

и в test.c у нас есть

void foo()
{
    test_t test;
    ...
}

во время компиляции, я думаю, что компилятор поместит код в файл заголовка и файл c вместе, и код в файле заголовка будет предварительно обработан и заменяет код в файле c Тем временем нам лучше определить путь включения в make-файле.

ответил How Chen 2 J000000Tuesday13 2013, 08:58:21
0

В некоторых системах попытки ускорить сборку полностью разрешенных файлов .c вызывают предварительную сборку включаемых файлов «компиляцией заголовочных файлов». Тем не менее, это метод оптимизации, который не является необходимым для фактической разработки C.

Такая техника в основном вычисляла операторы включения и сохраняла кэш сплющенных включений. Обычно набор инструментов C рекурсивно вырезает и вставляет во включенные файлы, а затем передает весь элемент компилятору. С предварительно скомпилированным кешем заголовков, цепочка инструментов проверит, изменились ли какие-либо входные данные (определения, заголовки и т. Д.). Если нет, то он предоставит компилятору уже сглаженные фрагменты текстового файла.

Такие системы были предназначены для ускорения разработки; однако многие такие системы были довольно хрупкими. По мере ускорения работы компьютеров и изменения методов управления исходным кодом в общем проекте фактически используется меньше прекомпиляторов заголовков.

Пока вам не понадобится оптимизация компиляции, я настоятельно рекомендую избегать предварительной компиляции заголовков.

ответил Edwin Buck 2 J000000Tuesday13 2013, 20:13:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132