VC++ 2010:'missing type specifier'错误来来去去,无需更改代码
VC++ 2010: 'missing type specifier' errors come and go without changes to code
假设有四个文件: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
(编译时必须包含它(,而且在文件中包含所需的一切更有意义。前向声明的情况并非如此,但同样,您使用的是完整类型,而不是指针。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- VC++ 2010:'missing type specifier'错误来来去去,无需更改代码