GCC:为什么编译.HPP文件与.cpp文件的结果不同

GCC: why does compiling a .hpp file gives different results than a .cpp file?

本文关键字:文件 结果 cpp 为什么 编译 HPP GCC      更新时间:2023-10-16

在这里我有一个非常简单的点类:

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包括(sstreamiostream),这使文件大小最高为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甚至没有找到不同的命名。