VC++ 2010:“缺少类型说明符”错误来来去去,无需更改代码

Posted

技术标签:

【中文标题】VC++ 2010:“缺少类型说明符”错误来来去去,无需更改代码【英文标题】:VC++ 2010: 'missing type specifier' errors come and go without changes to code 【发布时间】:2011-11-22 14:59:51 【问题描述】:

假设有四个文件: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.1 SP1Rel,项目类型是Win32 DLL。

【问题讨论】:

【参考方案1】:

您需要在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

bar.h 之前包括foo.h。确实,但是如果 bar.h 包含在 foo.h 之前的其他位置怎么办?这就是为什么在 bar.h 中包含 foo.h 是个好主意。任何包含 bar.h 的文件都不再需要包含 foo.h(为了编译它必须这样做),并且在文件中包含您需要的所有内容更有意义。前向声明不是这种情况,但同样,您使用的是完整类型,而不是指针。

【讨论】:

如果你只使用一个引用,而不仅仅是一个指针,一个声明也足够了。

以上是关于VC++ 2010:“缺少类型说明符”错误来来去去,无需更改代码的主要内容,如果未能解决你的问题,请参考以下文章

错误 C4430:缺少类型说明符 - 假定为 int?

C++ MSVC dll 编译错误缺少类型说明符和重新定义

将项目从 vc6 转换为 vc9 的问题

错误:缺少类型说明符 - 假定为 int。 C++ 不支持默认 int

错误 4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 [重复]

缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int----;解决方法