GCC:为什么编译.HPP文件与.cpp文件的结果不同
GCC: why does compiling a .hpp file gives different results than a .cpp file?
在这里我有一个非常简单的点类:
namespace wtf{
template<typename T> class Point{
public:
T x;
T y;
Point(T xx, T yy): x(xx), y(yy) {};
};
}
作为模板类,我的理解是不能像往常一样有单独的标题/实现文件。
如果我将包含此类Point.cpp
的文件命名,并将其编译到共享库中,如下所示,文件大小为5.6k,这似乎是合理的。但是,如果将文件重命名为Point.hpp
(或.hxx
或.h++
),则文件大小将增长到1.9m!显然,gcc
正在以不同的方式处理这两种文件类型!
在将其剥离为MWE之前,还有其他标准LIB包括(sstream
和iostream
),这使文件大小最高为11m!不过,这也可能给出了更多有关正在发生的事情的线索...
我对这里实际发生的事情感到好奇,以及gcc
是否有其他方式对标头文件和代码文件有所不同。通常,我使用了gcc
5.2.0,尽管较旧版本也发生了同样的事情。
我确实知道尝试编译标头文件可能不是典型的,但是由于i dod 尝试找到一个有趣的结果,所以我想知道正在发生的事情!
谢谢!
编辑:删除图像。
您已经欺骗了编译器来命名文件libPoint.so
,而实际上它不是共享库。
tl; dr:您正在制作预编译标题。
有效地指编译器处理整个标题并将其自身状态保存到文件中。稍后,当您给它一个.c
/.cpp
文件时,以 #include "Point.hxx"
开头时,它会从预编译的标头加载状态,因此它不需要再次处理。因此,您的代码编译更快。在源文件中,只有第一个标头可以从此。
如果您从命令中删除-o blah.so
,GCC将其命名为Point.hxx.gch
,这是预编译标头的预期名称。实际上,GCC甚至没有找到不同的命名。
相关文章:
- 使用 find 解析文件会给出不同文件的奇怪结果
- Boost program_options将多个配置文件解析结果存储到一个parsed_options中
- 如何从主.cpp中的cpp文件中获取功能结果?
- CSV文件之间的差异,使用getline()产生不同的结果
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- 使用 BOOST property_tree / iostreams / 文件系统 / foreach - 结果出现链接
- 如何在EXECUTE_PROCESS中使用文件(GLOB_RECURSE)的结果?
- 按扩展名过滤搜索文件会返回太多结果
- 当与Windows和Linux下的Ifstream相反的二进制文件时,结果不同
- C 可执行文件从浏览器下载而不是显示结果
- 从文本文件中读取并使用 sizeof 结果计算整数的数量到 nan
- 如何指定创建文件函数获取未缓存的结果?
- 该程序应该创建一个带有结果的输出文件,但文件中没有任何内容
- VIM:执行复杂文件类型的脚本和显示结果
- 为什么在 2 个不同的 cpp 文件中定义内联全局函数会导致神奇的结果
- 如何在C 中为文本文件编写代码结果(在void函数之内)
- 如何将结果存储到文本文件中
- 多线程文件读取为每个线程生成相同的结果
- 获取命令行请求的结果并打开文件
- 写入正确的位图文件结果