2014-12-13 3 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 [편집]

미리 컴파일 된 헤더는 GCC (3.4 이상)에서 지원된다. GCC의 접근법은 VC 및 호환 컴파일러와 유사합니다. GCC는 ".gch"접미사를 사용하여 미리 컴파일 된 헤더 파일 을 저장합니다. 소스 파일을 컴파일 할 때 컴파일러는이 파일이 같은 디렉토리에 있는지 여부를 확인하고 가능한 경우이를 사용합니다.

GCC는 헤더가 컴파일 될 때와 동일한 컴파일러 스위치가 설정되고 최대 하나까지만 사용할 수있는 경우에만 미리 컴파일 된 버전을 사용할 수 있습니다. 또한 사전 처리 된 명령어는 사전 컴파일 된 헤더 앞에 배치 될 수 있습니다 (컴파일 가능한 코드보다 먼저 다른 일반 헤더를 통해 직접 또는 간접적으로 포함되어야하기 때문에).

GCC는 자동으로 대부분의 헤더 파일을 확장자로 식별합니다. 그러나 이것이 실패하면 (예 : 비표준 헤더 확장으로 인해) -x 스위치를 사용하여 GCC가 파일을 헤더로 처리하도록 할 수 있습니다.

미리 컴파일 된 헤더 파일에 대한 훌륭한 토론은 다음 위치에 있습니다. https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

3

파일 이름은 실제로 매우 임의적입니다.

헤더 파일이 실제로 번역 단위라고 말하면 컴파일러는 컴파일해야하며 명령을 따릅니다.

그러나 규칙을 위반하면 다른 사람 (그리고 앞으로 5 분이 지나면 자아를 혼동)에 딱딱한 처벌을 받게됩니다. 따라서 불필요하게 그렇게하지 마십시오. 여기에는 필요가 없습니다.

BTW : 자체적으로 헤더 파일을 컴파일하는 데는 정확히 하나의 용도가 있으며, 이는 자체 포함되어 있는지 확인합니다.
그래도, 모든 헤더 파일에 대한 구현 파일이 있기 때문에 필요하지 않습니다. 어쨌든 첫 번째 줄에 헤더 파일이 들어 있습니다. 맞습니까?

1

C++는 이 작동하는 것으로 보이는 인 것의 영역입니다.

사무실에서 냉담한 피자를 먹는 것이 중요하지 않은 경우 "컴파일러가이 문제에 대해 불평하지 않았다"와 "실제로 작동합니다"의 차이점을 배우는 것이 좋습니다.

이 특별한 경우에는 .h 안에 main()을 넣을 수 있습니다. 컴파일러와 링커가 행복하게 작업 할 것입니다.

누군가가 (아마도 자신의 3 주 이상 된) 사람이 말한 것을 포함하려고 시도 할 때 무엇을 할 것이며, 중복되는 주 심볼에 대해 불만을 제기합니까? (그리고 그것은 이상한 템플릿 오류 메시지 문제를 방목하지도 않습니다).

관련 문제