C++ 头文件编译成目标文件?

C++ 头文件编译成目标文件?,c++,c,header,makefile,C++,C,Header,Makefile,下面是我的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)/uti

下面是我的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)/$@ $<
CXX=g++
CXXFLAGS=-Wall-c-std=c++11
SRC_DIR=SRC
TARGET_DIR=Debug
main:constants.o
常数o:\
$(SRC_DIR)/util/constants.h
$(CXX)$(CXXFLAGS)-o$(目标目录)/$@$<

文件名实际上相当随意

如果您说您的头文件实际上是编译器应该编译的翻译单元,那么它将遵循以下顺序

但是,违反惯例会对混淆他人(以及5分钟后你未来的自我)造成严厉的惩罚;因此,不要不必要地这样做,这里也没有必要

顺便说一句:单独编译头文件有一个用途,那就是确保它们是自包含的。

不过,这应该是不必要的,因为每个头文件都有一个实现文件,它在第一行包含头文件,对吗?

文件名实际上是任意的

如果您说您的头文件实际上是编译器应该编译的翻译单元,那么它将遵循以下顺序

但是,违反惯例会对混淆他人(以及5分钟后你未来的自我)造成严厉的惩罚;因此,不要不必要地这样做,这里也没有必要

顺便说一句:单独编译头文件有一个用途,那就是确保它们是自包含的。

尽管如此,这应该是不必要的,因为每个头文件都有一个实现文件,它在第一行包含头文件,对吗?

C++似乎是一个可行的领域

如果晚上在办公室吃冷比萨饼不是你的事,我建议你尽快了解“编译器没有抱怨这个”和“这个确实有效”之间的区别

在这种特殊情况下,您可以在.h中放置一个main()。编译器和链接器将愉快地处理它


问题是,当有人(可能比你大3周)试图将said.h包含在内并收到关于重复主符号的投诉时,你会怎么做?(这甚至还没有涉及到über隐秘的模板错误消息问题)。

C++是一个似乎可以工作的领域

如果晚上在办公室吃冷比萨饼不是你的事,我建议你尽快了解“编译器没有抱怨这个”和“这个确实有效”之间的区别

在这种特殊情况下,您可以在.h中放置一个main()。编译器和链接器将愉快地处理它

问题是,当有人(可能比你大3周)试图将said.h包含在内并收到关于重复主符号的投诉时,你会怎么做?(这甚至还没有消除über隐式模板错误消息的问题)。

头文件可以预编译,这样做是有充分理由的。
此链接:
讨论预编译的头文件。以下是GCC的描述
对于来自上述链接的预编译头文件:
GCC[编辑]

GCC(3.4及更新版本)支持预编译头。GCC的方法类似于 这些是VC和兼容编译器的一部分。GCC保存头文件的预编译版本 使用“.gch”后缀。编译源文件时,编译器会检查 文件存在于同一目录中,并尽可能使用它

GCC只能使用预编译版本,前提是设置了与编译头时相同的编译器开关,并且最多可以使用一个。此外,只有预处理器指令可以放在预编译头之前(因为它必须在任何可编译代码之前通过另一个普通头直接或间接包含)

GCC通过扩展名自动识别大多数头文件。但是,如果失败(例如,由于非标准头扩展名),可以使用-x开关确保GCC将文件视为头

关于预编译头文件的另一个精彩讨论位于:
头文件可以预编译,这样做有充分的理由。
此链接:
讨论预编译的头文件。以下是GCC的描述
对于来自上述链接的预编译头文件:
GCC[编辑]

GCC(3.4及更新版本)支持预编译头。GCC的方法类似于 这些是VC和兼容编译器的一部分。GCC保存头文件的预编译版本 使用“.gch”后缀。编译源文件时,编译器会检查 文件存在于同一目录中,并尽可能使用它

GCC只能使用预编译版本,前提是设置了与编译头时相同的编译器开关,并且最多可以使用一个。此外,只有预处理器指令可以放在预编译头之前(因为它必须在任何可编译代码之前通过另一个普通头直接或间接包含)

GCC通过扩展名自动识别大多数头文件。但是,如果失败(例如,由于非标准头扩展名),可以使用-x开关确保GCC将文件视为头

关于预编译头文件的另一个精彩讨论位于:

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: