2014-12-13 2 views
0

Ниже приведен фрагмент моего файла Makefile. Я где-то читал, что заголовочные файлы никогда не должны компилироваться самостоятельно (т. Е. Без файла .c или .cpp), но ниже, похоже, работает, и я получаю файл constants.o. Этот файл полезен? Что делать, если я использую шаблоны C++: Должен ли я до сих пор не компилировать файлы .h и .tcc?Файлы заголовков, скомпилированные в объектные файлы?

CXX = g++ 
CXXFLAGS = -Wall -c -std=c++11 
SRC_DIR = src 
TARGET_DIR = Debug 

main: constants.o 

constants.o: \ 
    $(SRC_DIR)/util/constants.h 
    $(CXX) $(CXXFLAGS) -o $(TARGET_DIR)/[email protected] $< 

ответ

1
header files can be pre-compiled and there are good reasons to do so. 
this link: <http://en.wikipedia.org/wiki/Precompiled_header> 
discusses pre-compiled header files. The following is from the GCC description 
for pre-compiled header files from the above link: 

НКУ [править]

Предкомпилированные заголовки поддерживаются в GCC (3.4 и новее). Подход GCC похож на этих VC и совместимых компиляторов. GCC сохраняет предварительно скомпилированные версии файлов заголовков с использованием суффикса .gch. При компиляции исходного файла компилятор проверяет, присутствует ли этот файл в том же каталоге и использует его, если это возможно.

GCC может использовать только предварительно скомпилированную версию, если одни и те же ключи компилятора устанавливаются так же, как при компиляции заголовка и могут использоваться не более одного. Кроме того, перед предварительно скомпилированным заголовком могут быть помещены только инструкции препроцессора (потому что он должен быть прямо или косвенно включен через другой обычный заголовок перед любым компилируемым кодом).

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

еще один прекрасный обсуждение предварительно скомпилированных заголовочных файлов находится по адресу: https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

3

Имя файла на самом деле довольно произвольно.

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

Но нарушение конвенций имеет жесткое наказание в замешательстве других (и ваше будущее в 5 минут); таким образом, не делайте этого без нужды, и здесь нет необходимости.

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

1

C++ - это область вещей, которая выглядит для работы.

Если вы ночевали в своей конторе, пища в вашем офисе не ваша вещь, я советую вам узнать разницу между «компилятором не жалуются на это» и «это действительно работает» быстро.

В этом конкретном случае вы можете очень хорошо поставить main() внутри вашего .h. Компилятор и компоновщик будут с удовольствием работать над этим.

Вопрос в том, что вы будете делать, если кто-то (возможно, ваш собственный человек старше на 3 недели) пытается включить указанный .h и получает жалобу на дублирующий главный символ? (и это даже не падает в сообщениях об ошибках в криптографических шаблонах über).

Смежные вопросы