错误 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 依赖于了解BallPod 类,因此该头文件应包含Ball.hPod.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”的前面)

C++ 编译错误 C2146 和 C4430

头文件互相包含与error C2146: 语法错误 : 缺少“;”的问题

.NET 进程外服务器的#import 问题

类内部结构内部的字符串[关闭]