C++ C++;编译器不规则地在头文件之前解析源文件

C++ C++;编译器不规则地在头文件之前解析源文件,c++,visual-studio-2015,C++,Visual Studio 2015,当我更改包含模板类定义的头文件时,我的编译器(VS2015附带的编译器)首先解析实例化类的源文件,然后才解析头文件。这将导致不正确的二进制文件 但是,如果我再次更改头文件并进行编译,解析顺序是正确的(头先,源后),并且生成的二进制文件执行正确的工作 编译器解析文件的顺序可以在buildoutput窗口中看到,我没有启用并行或多处理器编译选项 我可以以100%的成功率复制这个。我做错什么了吗?有什么我可以改变的吗 代码如下 h班 template<class T> class Clas

当我更改包含模板类定义的头文件时,我的编译器(VS2015附带的编译器)首先解析实例化类的源文件,然后才解析头文件。这将导致不正确的二进制文件

但是,如果我再次更改头文件并进行编译,解析顺序是正确的(头先,源后),并且生成的二进制文件执行正确的工作

编译器解析文件的顺序可以在buildoutput窗口中看到,我没有启用并行或多处理器编译选项

我可以以100%的成功率复制这个。我做错什么了吗?有什么我可以改变的吗

代码如下

h班

template<class T> class Class {
    void foo () {
        WriteToFile("A");
    }
完整构建/重建。文件中的输出:A

步骤1:

将以下行添加到
foo()
WriteToFile(“B”)
编译:输出顺序:Usage.cpp,Class.h
文件中的输出:A

步骤2:

将以下行添加到
foo()
WriteToFile(“C”)
` 编译:输出顺序:Class.h,Usage.cpp 文件中的输出:A B C

继续,直到永远,同样的行为

注意:我只需点击F7键“Build”,在完全重建后,它工作正常,但需要很长时间。

您的源文件(.cpp)只被编译,它会将包含的头文件(.h)中的代码复制到源文件中。 头文件不是独立编译的


您可以从构建输出窗口复制日志吗。

您发布的代码充满了bug,如果这是您的普通代码示例,那么可能会发生任何事情

正如上面提到的,您不应该看到h文件正在编译。如果您这样做了,那么您可能已经将其设置为编译为cpp文件或类似文件。那是你首先应该找的地方

H文件在预处理阶段添加到CPP文件中,生成长源文件,如果选择“编译”选项保留这些文件,则可以读取这些文件。不知道我脑子里想的是什么。如果查看这些长文件,您将看到Class.h正在
#include“Class.h”
语句出现时添加到Usage.cpp中。除非您包含Class.h的旧版本,否则很难看到您所描述的任何情况会发生。除非您使用的是预编译头,并且class.h文件是PCH的一部分,并且您使用的是过时的PCH文件


如果每次都使用“重建”,而不是“构建”(F7),我怀疑问题会消失。我怀疑这可能是因为PCH生成问题,因此请检查stdafx.cpp是否设置为重新生成PCH。

已修复。在Visual Studio解决方案资源管理器->属性->项目类型中,右键单击该文件。对于特定的头文件,它被设置为C/C++编译器。在将其更改为C/C++头之后,它工作了


我认为这是因为当我在解决方案中添加一个新文件时,我右键单击一个过滤器->添加新项目。如果选择了源文件,我没有麻烦将其更改为头文件,我只是将文件命名为SomeName.h。看来这会有所不同。基于此,.vcxproj将包含一行以

开头的with you文件。您永远不会看到编译的*.h文件-您设置了错误的内容。*。h文件是#包含在*.cpp文件中;*。已编译cpp文件。您的类模板定义(
模板类
)不完整。当包含在编译单元中时,这将产生有趣的编译器错误。即使编辑(
模板类
),它仍然不完整。请不要发布编造的源代码,即使你认为它很琐碎。代码生成和运行,我只是在这里键入时错过了它。这不是一个编译器错误的问题,但无论如何,谢谢你,我有edited@Hame“编译:输出顺序:Usage.cpp,Class.h”-这是wrong@Hame我同意Richard的观点,它就是不能按照那个顺序编译,所以要么是一个陈旧的文件,要么就是你认为自己没有得到二进制文件。
Class* c = new C();
c->foo();