错误计数超过100,只有一个错误

error count exceeds 100 with just one error

本文关键字:错误 有一个      更新时间:2023-10-16

我在VS中有一个C++项目,其中或多或少有100个文件(每个文件都是一个类)。几天前我修改了一个,添加了一些声明,现在我无法编译,它给出了很多错误,最后一个:

错误计数超过100;停止编译

张贴错误似乎毫无用处,但以下是一些(几乎都是一样的):

error C2275: 'btTransform' : illegal use of this type as an expression  
error C2275: 'btVector3' : illegal use of this type as an expression
error C2275: 'btVector3' : illegal use of this type as an expression    
error C2275: 'btVector3' : illegal use of this type as an expression    
error C2504: 'Platform' : base class undefined
error C2535: 'btAlignedObjectArray<T>

请注意,大多数提到的错误不应该是错误,IntelliSense在错误列表输出中没有显示错误。我完全相信我忘了;或类似的东西。

我该怎么办?我也在处理很多东西,我忘了修改了哪个文件。我浏览了大部分,但什么也找不到。

以下是完整的列表:http://pastebin.com/1CD9fGgn(它太长了,不适合这里)

按要求:

Player.h

#pragma once
#include <Ogre.h>
#include "BtOgreGP.h"
#include "BtOgrePG.h"
#include <OISKeyboard.h>
#include <OISJoyStick.h>
#include "BulletCollisionCollisionDispatchbtGhostObject.h"
#include "balance.h"
#include "WorldGenerator.h"
#include "Keys.h"
#include "PlayerController.h"
using namespace Ogre;
class Player
{
public:
    Player(Root*, SceneManager*, RenderWindow*);
    ~Player(void);
    Camera* mCamera;
    void update(const FrameEvent&);
    bool isTouchingBelow();
//  bool isJumping();
    btPairCachingGhostObject* getGhostObject()
    {
        return mGhostObject;
    }
    void clearObjectTouchingNormal()
    {
        mNormals->clear();
    }
    void addObjectTouchingNormal(btVector3* vector)
    {
        mNormals->push_back(*vector);
    }
    btAlignedObjectArray<btVector3> getObjectTouchingNormal()
    {
        return *mNormals;
    }
private:
    btAlignedObjectArray<btVector3>* mNormals;
    double mTimeLastJump;
    WorldGenerator* mGenerator;
    bool mPressJumpLastUpdate;
//  btAlignedObjectArray<btVector3> getObjectTouchingNormal();
    Vector3 mLastVectorVelocity;
    //SceneNode* mCameraHelper;
    SceneNode* mMainNode;
    SceneNode* mBodyNode;
    SceneNode* mCameraPivot;
    SceneNode* mCameraYaw;
    SceneNode* mCameraPitch;
    SceneNode* mCameraHolder;
    SceneManager* mSceneManager;
    BtOgre::DebugDrawer* mDebugDrawer;
    //btRigidBody* mPlayerBody;
    btQuaternion* mDefaultQuaternion;
    Vector3 mStartPosition;
    PlayerController* mKinematicController;
    btPairCachingGhostObject* mGhostObject;
    //bool mIsJumping;
    Radian mLastRotation;
    btVector3 mBodyDimensions;
    /*bool mCameraCenterMovementFlag;
    Radian mCameraCenterYaw;*/
};
class ClosestNotMe : public btCollisionWorld::ClosestRayResultCallback
{
protected:
    btRigidBody* mMe;
public:
    ClosestNotMe (btRigidBody* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
    {
        mMe = me;
    }
    virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace)
    {
        if (rayResult.m_collisionObject == mMe)
            return 1.0;
        return btCollisionWorld::ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace);
    }
};

Globals.h

#pragma once
#include <Ogre.h>
#include <vector>
#include "Player.h"
enum GameDifficulty
{
    GD_EASY,
    GD_NORMAL,
    GD_HARD
};
class GlobalVariables
{
public:
    static std::vector<Player*> players;
};

滚动到错误列表的顶部,并处理该错误。如果您在Visual Studio中,可以编译它并点击Ctrl-Shift-F12。

如果你在语法上犯了一些错误(我通常的错误是一个不匹配的引号或大括号),编译器可能会丢失上下文,因此从那一点开始的所有内容都会变得难以理解;然后——如果还有错误的话——下一个。在某个时刻,你会发现你做了那件事,剩下的错误就会神奇地消失。

欢迎来到c++错误的奇妙世界。

当遇到类似的情况时,从报告的第一个错误开始(查看编译器的输出)。然后重新编译。重复,直到不再出现错误为止。

有很多不同的语法错误会完全破坏文件的其余部分。其中包括声明中的错误类型、缺少分号和缺少大括号。

我已经看到200多个错误随着一个字符的修复而消失。

此外,如果您在一个头文件中忘记了分号或大括号,则可能会在下一个包含的头文件中导致错误。我在windows.h中出现了非常严重的错误,因为我在它之前包含了我的头,但忘记了一些东西。

当您转储(带注释的)预处理输出并查看编译器获得的信息时,解决棘手的编译器错误问题(如您描述的问题)会变得更加容易。cl.exe采用/E参数,以便将经过预处理的输出转储到stdout(另请参阅此SO答案)。如果您使用它,并在该上下文中查看错误,它应该是清楚的。

在您认为正在定义该标识符的文件中出现类似'Player': undeclared identifier的错误,很可能是由循环依赖性引起的。例如,PlayerController.h是否包含对没有前向声明的Player类的引用?

源代码管理是关键。根据您的评论和额外的代码,也请发布播放器.h的内容。

一般来说,在这种可怕的情况下,我会进行二进制搜索,并注释掉项目的大部分内容。

包含在几个cpp中的h文件中的错误通常更有可能从一个小错误中收集大量错误。cpp解析问题只会影响cpp。在h文件中查找错误。

此外,一般的建议是,尽量将所有h文件引用保留在cpp文件中,并将h文件中对h文件的引用限制在绝对最小值,这将减少包括噩梦。正如你所看到的,player.h包含了大量的h文件。它们中的每一个都可能是罪魁祸首,我建议逐一对它们进行注释,并等待关于未定义符号的错误,而不是您现在看到的错误。这意味着你不再有解析错误,现在有一个丢失的定义(因此错误在你注释掉的文件中或它包含的一个文件中…)。

相关文章: