2014-12-13 29 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分钟后自己)的严厉惩罚;因此,不这样做是不必要的,这里没有必要。

顺便说一下:编译头文件的确有一种用法,这是确保它们是自包含的。
不过,这应该是不必要的,因为你有一个每个头文件的实现文件,无论如何它都包含头文件,对吗?

1

C++是似乎工作的东西的境界。

如果在你的办公室里花费冷食比萨饼的夜晚不是你的事,我建议你快速学习“编译器没有抱怨这个”和“这个实际工作”之间的区别。

在这种特殊情况下,你可能很好地将一个main()放在你的.h中。编译器和链接器将很高兴地处理它。

问题是,如果某人(可能是自己3周以上的自己)试图包含上述.h并获得有关重复主符号的投诉,您会怎么做? (而且这甚至不会放弃关于模糊的模板错误信息问题)。