下面是我的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)/$@ $<
答案 0 :(得分:3)
文件名实际上非常随意。
如果你说你的头文件实际上是编译器应该编译的翻译单元,它将遵循命令。
但是违反惯例会使其他人感到困惑(以及从现在起5分钟后你自己的未来);因此,不要不必要地这样做,而且这里没有必要。
BTW:只有一个用于自己编译头文件的用途,这是确保它们是自包含的。
不过,这应该是不必要的,因为你有一个每个头文件的实现文件,无论如何都包括它的头文件,对吗?
答案 1 :(得分:1)
C ++是似乎工作的领域。
如果在你的办公室里度过夜晚吃冷的比萨饼不是你的事,我建议你学习“编译器没有抱怨这个”与“这实际上有效”之间的区别。
在这种特殊情况下,你可能会在你的.h中放置一个main()。编译器和链接器将很乐意使用它。
问题是,当有人(可能是你自己3个星期大的时候)试图包含所说的.h并得到关于重复主要符号的投诉时,你会做什么? (而且甚至没有放牧über神秘模板错误消息问题)。
答案 2 :(得分: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及更高版本)支持预编译头。海湾合作委员会的方法类似于 这些VC和兼容的编译器。 GCC保存头文件的预编译版本 使用&#34; .gch&#34;后缀。编译源文件时,编译器会检查是否存在 文件存在于同一目录中并尽可能使用它。
如果设置了与编译头文件相同的编译器开关并且最多可以使用一个编译器开关,则GCC只能使用预编译版本。此外,只有预处理器指令可以放在预编译头之前(因为它必须在任何可编译代码之前直接或间接地通过另一个普通头包含)。
GCC会根据其扩展名自动识别大多数头文件。但是,如果此操作失败(例如,由于非标准标头扩展),则可以使用-x开关确保GCC将文件视为标头。
对预编译头文件的另一个很好的讨论位于: https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html