错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前
Posted
技术标签:
【中文标题】错误 C2146:语法错误:缺少“;”在标识符 \'m_ball\' C++、MFC 之前【英文标题】:error C2146: syntax error : missing ';' before identifier 'm_ball' C++, MFC错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前 【发布时间】:2015-02-12 19:50:30 【问题描述】:我有心爱的错误 C2146。我检查了可能的错误,但找不到一个(据我所知,所有需要的;右键单击 Ball->GoToDefinition 后,它正确显示了类声明)
BallMasterDoc.h
#pragma once
class CBallMasterDoc : public CDocument
private:
Ball m_ball; //syntax error : missing ';' before identifier 'm_ball'
Pod m_pod; //syntax error : missing ';' before identifier 'm_pod'
BallMasterDoc.cpp
#include "Pod.h"
#include "Ball.h"
#include "BallMasterDoc.h"
球.h
#pragma once
const COLORREF BLUE = RGB(0, 0, 255);
extern int g_iRadius, g_iHeight;
extern int g_iWidth, g_iMaxWidth;//pod...
class Ball
public:
Ball();
~Ball();
BOOL Move(CPoint podPosition);
BOOL Start() return m_bStart;
BOOL Collision() return m_bCollision;
BOOL End() return m_bEnd;
CRect GetArea();
private:
BOOL CheckCollision(CPoint podPosition);
float m_fDirection;
int m_iB; // y = ax + B
BOOL m_bUpDown;//true - up
BOOL m_bStart;
BOOL m_bCollision;
BOOL m_bEnd;
CPoint m_ballCentre;
CPoint m_collisionPoint;
;
Pod.h
#pragma once
const COLORREF BLACK = RGB(0, 0, 0);
extern int g_iWidth, g_iMaxWidth;
class Pod
public:
Pod();
~Pod();
BOOL MoveLeft();
BOOL MoveRight();
CPoint Position() return m_Middle;
private:
CPoint m_Middle;
;
请告诉我有什么问题。
编辑
所有包含都在 cpp 文件中(那些由向导和我生成的)我只展示了这 3 个原因,因为在这种情况下,我不涉及其余的内容。我正在从名为:Microsoft Visual C++ Windows Applications by Example 的魔法书中学习 MFC,其中所有内容都包含转到 cpp 文件(即使我觉得它很奇怪,而且这本书远非支持这种风格的最佳向导......)
【问题讨论】:
Ball.h 是否包含在 BallMasterDoc.h 中? 如果你取出各种#pragma once
行有什么不同吗?
@clcto:当Ball进入BallMasterDoc.h时,编译器不需要知道什么是Ball吗?
这就是为什么许多样式文档都对#include 规定了特定顺序的原因。
你没有使用预编译头文件!???
【参考方案1】:
由于BallMasterDoc.h
依赖于了解Ball
和Pod
类,因此该头文件应包含Ball.h
和Pod.h
——而不是依赖于包含的任何.cpp
BallMasterDoc.h那些其他标题。
您发布的 BallMasterDoc.cpp
看起来不错,因此您的错误可能来自另一个 .cpp
文件,该文件确实包含 BallMasterDoc.h
但不包含该标头所需的标头。
【讨论】:
【参考方案2】:好的,我把 #include"Ball.h"/"Pod.h"
放在 BallMasterDoc.h 中,它解决了这个问题,但这并不令人满意,因为魔法书中的代码曾经有效(不是这个确切的程序,对我来说大部分该代码无论如何都不起作用)但现在没关系
【讨论】:
当您收到错误 C2146 时,它会告诉您错误发生时正在编译哪个.cpp
文件吗?
如果 Ball.h 和 Pod.h 包含在 stdafx.h(MFC 的预编译头文件)中,它将“神奇地”工作。看看你的魔法书是否使用了预编译的头文件,并列出了 stdafx.h 的代码,其中包含这些“较低级别”的包含文件..
@franji1wow 真的......因为我已经写了两次(如果我们计算间接一个,则为三次)已经全部包含转到 cpp 文件,因此 stdafx.h 中没有变化
@MattMcNabb 你说得对,这是我没有使用(修改)的 cpp 文件的错误,在我添加了这些包含之后它起作用了。如果你愿意,你可以回答来自其他单位的错误,所以我接受。以上是关于错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前的主要内容,如果未能解决你的问题,请参考以下文章
错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前
vs2008编译错误:error C2146: 语法错误 : 缺少“;”(在标识符“name”的前面)