VC++ 2010:'missing type specifier'错误来来去去,无需更改代码

VC++ 2010: 'missing type specifier' errors come and go without changes to code

本文关键字:来来去去 代码 specifier 2010 missing type VC++ 错误      更新时间:2023-10-16

假设有四个文件:foo.h、foo.cpp、bar.h、bar.cpp.

foo.h:

#pragma once
class foo
{
    // Whatever
};

foo.cpp

#include "foo.h"
// Foo's definitions

bar.h

#pragma once
class bar
{
    bar(const foo & f); // < C4430 'missing type specifier' (not always)
    // Other declarations
};

bar.cpp

#include "foo.h"
#include "bar.h"
// Bar's definitions

编译器说bar.h中有C4430。但奇怪的是,我可以通过注释然后取消注释来构建代码。当然,构建会失败,同时也会对行进行注释,但当我取消注释时,构建会成功。因此,相同的代码可能会产生错误,也可能不会产生错误。

我的VS是10.0.40219.1SP1Rel,项目类型是Win32 DLL。

您需要在bar.h:中包含foo.h

#pragma once
#include "foo.h"
class bar
{
    bar(const foo & f);
};

如果您需要一个完整的类定义,除非您使用指针(在这种情况下,向前声明就足够了(,否则您需要包括声明类的文件。

为什么它有时会编译,有时会失败

取决于编译器。我的猜测是foo.h包含在一个文件中,该文件在到达bar.h之前进行编译。所以bar.h已经知道了foo的定义。如果生成失败,将跳过成功编译的文件,并且可能不再包括foo.h。或者,如果只在x.cpp中进行更改,编译器将只生成该文件,并可能跳过包含foo.h,该文件已包含在已编译的文件中。

我希望我是清白的。

为什么你已经拥有的还不够

你可能会说

//Bar.cpp
#include "foo.h"
#include "bar.h"
// Bar's definitions

在CCD_ 11之前包括CCD_。的确,但是如果bar.h被包括在foo.h之前的另一个地方呢?这就是为什么在bar.h中包含foo.h是一个好主意。任何包含bar.h的文件都不需要再包含foo.h(编译时必须包含它(,而且在文件中包含所需的一切更有意义。前向声明的情况并非如此,但同样,您使用的是完整类型,而不是指针。