错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前

Posted

技术标签:

【中文标题】错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前【英文标题】:error C2146: syntax error : missing ';' before identifier 'ContextRecord' 【发布时间】:2013-05-11 20:54:48 【问题描述】:

我有一个头文件,其中包含所有类的功能,包括代码,因此该类没有 cpp 文件。一切正常。我添加了 cpp 文件并将功能代码移到该文件上,现在编译时出现此错误。我在 ((x86)\microsoft sdks\windows\v7.0a\include\winnt.h(6361)) 中收到错误的标头甚至不包含在我正在更改的文件中。有谁知道这可能是什么原因?我可以提供我只是不知道有什么帮助的代码。

cpp 文件:

#include "Fisherman.h"

void Fisherman::Initialise()

memset((void*)&mListener, 0, sizeof(X3DAUDIO_LISTENER));
memset((void*)&mEmitter, 0, sizeof(X3DAUDIO_EMITTER));
memset((void*)&mDSPSettings, 0, sizeof(X3DAUDIO_DSP_SETTINGS));

XAUDIO2_VOICE_DETAILS details;
mCastSplash->GetSourceVoice()->GetVoiceDetails(&details);       
mEmitter.ChannelCount = details.InputChannels; 
mEmitter.CurveDistanceScaler = 1.0f;
X3DAUDIO_VECTOR emitterPos =  0.0f, 0.0f, 0.0f; 
mEmitter.Position = emitterPos;
X3DAUDIO_VECTOR emitterVel =  0.0f, 0.0f, 0.0f ; 
mEmitter.Velocity = emitterVel;

mDSPSettings.SrcChannelCount = mEmitter.ChannelCount; 
mDSPSettings.DstChannelCount = mXACore->GetChannelCount();

FLOAT32 * matrix = new FLOAT32[mDSPSettings.SrcChannelCount * mDSPSettings.DstChannelCount];

mDSPSettings.pMatrixCoefficients = matrix;

X3DAUDIO_VECTOR front =  0.0f, 0.0f, 1.0f ; 
X3DAUDIO_VECTOR top =  0.0f, 1.0f, 0.0f ; 
mListener.OrientFront = front;
mListener.OrientTop = top;
X3DAUDIO_VECTOR listenerVel = 0.0f, 0.0f, 0.0f;
mListener.Velocity = listenerVel;
X3DAUDIO_VECTOR listenerPos =  0.0f, 0.0f, 0.0f ; 
mListener.Position = listenerPos;


void Fisherman::Rotate (int MouseDeltaX)
X3DAUDIO_VECTOR input = mListener.OrientFront;
X3DAUDIO_VECTOR result;
float theta = -(X3DAUDIO_PI/1000)*MouseDeltaX;

float cs = cos(theta);
float sn = sin(theta);

if(cs < 0.00001) cs = 0.0f;

result.x = input.x * cs - input.z * sn;
result.z = input.x * sn + input.z * cs;
result.y = 0.0f;

mListener.OrientFront = result;



bool Fisherman::Cast(Fish* aFish)
mCast->Play(0);
mCastOut = true;
mFish = aFish;

X3DAUDIO_VECTOR seg_v = Multiply(mListener.OrientFront, 30);

X3DAUDIO_VECTOR pt_v = mFish->GetX(), 0.0f, mFish->GetZ();

float proj_v_length = Dot(pt_v, mListener.OrientFront);

X3DAUDIO_VECTOR proj_v = Multiply(mListener.OrientFront, proj_v_length);

X3DAUDIO_VECTOR dist_v = Subtract(pt_v, proj_v);

if(VectorLength(dist_v) < mFish->GetRadius())
    mEmitter.Position = mFish->GetEmitter().Position;

    return true;
else

    mEmitter.Position = Multiply(mListener.OrientFront, 15);

    return false;




void Fisherman::ReelIn(Fish* aFish)

mFish = aFish;
mFish->MoveCloser(mReelSpeed);
mReelingIn = true;


void Fisherman::ReelOut(Fish* aFish)
mFish = aFish;
mFish->MoveFurther();
mReelingIn = false;


void Fisherman::SetReelSpeed(float deltaTime) 
float reelSpeed = 1.0f - deltaTime;
if(reelSpeed < 0.0f)
    reelSpeed = 0.0f;


if(reelSpeed > 10)

    mReelSpeedList.push_back(reelSpeed);
    if(mReelSpeedList.size() > 3)
        mReelSpeedList.pop_front();
    

    reelSpeed = 0.0f;
    std::list<float>::const_iterator iterator;
    for (iterator = mReelSpeedList.begin(); iterator != mReelSpeedList.end(); ++iterator)
            reelSpeed += *iterator;
    


    mReelSpeed = reelSpeed/mReelSpeedList.size();
else
    mReelSpeed = reelSpeed;
mReelClickTimer = 0.1 / mReelSpeed;



void Fisherman::PlayReelClick()

if(!mReelClick[0]->IsPlaying())
    mReelClick[0]->Play(0);
else if(!mReelClick[1]->IsPlaying())
    mReelClick[1]->Play(0);
else if(!mReelClick[2]->IsPlaying())
    mReelClick[2]->Play(0);
else if(!mReelClick[3]->IsPlaying())
    mReelClick[3]->Play(0);
else if(!mReelClick[4]->IsPlaying())
    mReelClick[4]->Play(0);
else 
    return;



bool Fisherman::NothingPlaying() // check to see if any sounds are playing
if(mCast->IsPlaying())return false;
if(mCastSplash->IsPlaying())return false;
for(int i =0; i < REEL_CLICK_OBJECTS; i++)
    if(mReelClick[i]->IsPlaying())
        return false;
    


return true;
 

void Fisherman::SetReelingIn(bool isReelingIn)
mReelingIn = isReelingIn;


void Fisherman::SetCastOut(bool hasCastOut)
    mCastOut = hasCastOut;


float Fisherman::GetReelClickTime()
    return mReelClickTimer/CLICK_TIMER_MULTIPLIER;


bool Fisherman::IsReelingIn()
    return mReelingIn;


float Fisherman::GetReelSpeed()
    return mReelSpeed;


X3DAUDIO_LISTENER Fisherman::GetListener()
    return mListener;


X3DAUDIO_EMITTER Fisherman::GetEmitter()
    return mEmitter;


X3DAUDIO_DSP_SETTINGS Fisherman::GetSettings()
    return mDSPSettings;


XASound* Fisherman::GetCastSound()
    return mCast;


XASound* Fisherman::GetCastSplashSound()
    return mCastSplash;


bool Fisherman::HasCastSplashed()
    return mCastSplashBool;


void Fisherman::SetCastSplashed(bool splashed)
    mCastSplashBool = splashed;


bool Fisherman::IsCastOut()
    return mCastOut;

标题:

#ifndef _FISHERMAN_H_
#define _FISHERMAN_H_

#include <X3DAudio.h>
#include <math.h>
#include <list>

#include "VectorCalculations.h"
#include "Fish.h"
#include "XASound.hpp"
using AllanMilne::Audio::XASound;

const float CLICK_TIMER_MULTIPLIER = 2.5f;
const int REEL_CLICK_OBJECTS = 5;
class Fisherman
public:

    Fisherman(XACore* aXACore, XASound *cast, XASound *castSplash, std::list<XASound*> reelClickList)
        : // a Fish Object pointer for the fisherman to interact with.
        mFish (NULL), mXACore (aXACore),
        //XASound objects with sounds for the fisherman
        mCast (cast), mCastSplash (castSplash)
    
        mReelSpeedList.clear();

        for(int i = 0; i < REEL_CLICK_OBJECTS; i++)
            mReelClick[i] = reelClickList.front();
            mReelClick[i]->SetVolume(2.0f);
            reelClickList.pop_front();
            mReelClickList.push_back(mReelClick[i]);

        

        mCastSplash->SetVolume(7.0f);

        mXACore = aXACore;

        mCastSplashBool = false;
        mCastOut = false;
        mReelingIn = false;
        mCastDistance = 0.0f;
        Initialise();
    

    ~Fisherman()

    void Initialise();

    void Rotate(int MouseDeltaX);

    bool Cast(Fish* aFish);

    void ReelIn(Fish* aFish);

    void ReelOut(Fish* aFish);

    void SetReelSpeed(float deltaTime);

    void PlayReelClick();

    bool NothingPlaying(); // check to see if any sounds are playing

    void SetFront(X3DAUDIO_VECTOR front);

    void SetReelingIn(bool isReelingIn);

    void SetCastOut(bool hasCastOut);

    float GetReelClickTime();

    bool IsReelingIn();

    float GetReelSpeed();

    X3DAUDIO_LISTENER GetListener();

    X3DAUDIO_EMITTER GetEmitter();

    X3DAUDIO_DSP_SETTINGS GetSettings();

    XASound* GetCastSound();

    XASound* GetCastSplashSound();

    bool HasCastSplashed();

    void SetCastSplashed(bool splashed);

    bool IsCastOut();


private:

    XACore *mXACore;

    XASound *mCast;
    XASound *mCastSplash;
    XASound *mReelClick[REEL_CLICK_OBJECTS];


    float mCastDistance; 
    float mReelClickTimer;
    float mReelSpeed;

    std::list<float> mReelSpeedList;
    std::list<XASound*> mReelClickList; 

    X3DAUDIO_LISTENER mListener; 
    X3DAUDIO_EMITTER mEmitter;
    X3DAUDIO_DSP_SETTINGS mDSPSettings;

    Fish *mFish;
    bool mCastOut;
    bool mCastSplashBool;
    bool mReelingIn;
;


#endif

在头文件顶部包含 windows.h 解决了这个问题。

【问题讨论】:

是的,这会很有帮助;) 你的类声明末尾有分号吗? 是的,我愿意。这是我检查的第一件事。我还有其他带有 cpp 文件的类,所以我不知道为什么这个会起作用。 您的代码有错误。 大胆猜测:尝试在顶部添加#include &lt;windows.h&gt; 【参考方案1】:

错误是否也说PCONTEXT undefined

尝试在#include &lt;X3DAudio.h&gt; 之前添加#include &lt;Windows.h&gt;

回复关于unresolved external symbol的评论:

那是因为你没有在 cpp 文件中定义Fisherman::SetFront

【讨论】:

是的,你是对的。我修改了这一点。你能告诉我为什么添加 windows.h 可以解决问题吗? &lt;X3DAudio.h&gt; 包括&lt;windef.h&gt;,其中包括&lt;winnt.h&gt;,其中有此行PCONTEXT ContextRecord;。这没有定义,通过包含 #include &lt;Windows.h&gt; 它定义了正确的常量以确保定义了 PCONTEXT【参考方案2】:

整个代码会很有帮助。你还记得很明显给函数名称等命名空间吗?

class A  void foo()   ;
=>
class A  void foo(); 
void A::foo()  ... 

等等?

最快的方法是在它工作时恢复到状态,而不是一次全部移动,而是一次只移动一个功能。然后当问题发生时,您可以给我们特定的代码或尝试自己修复它。

【讨论】:

是的,我也这样做了。好吧,我试过了,但只是在 cpp 文件中包含“包含“fisherman.h”会引发此错误。 记得在fisherman.h之前包含必要的文件。我通常包括 STL/STD 库,然后是 SDL 等外部库,然后是头文件,但当然它可能会有所不同,但仍然可以,具体取决于您现在正在做什么。【参考方案3】:

很可能在这一行之前的某个地方只漏掉了一个';'。

仔细检查您的代码,记住您在 cpp 文件中定义的所有内容都必须已经在您的类定义中声明。

我想发表评论,但显然我不允许。

无论如何,作为一种让我们了解您正在尝试做什么的更简单的方式,请明确发布您的代码 - 它不必与您使用的完全相同,但应该是一段简洁的通用代码,突出显示你是如何做某事的。 (SSCCE) 如果它确实是你输入的错误,最好有你的确切代码,但把它放在 pastebin 上并提供一个链接,这样这个页面就不会出现大量代码。

编辑: winnt.h 显然会导致各种问题:Weird compile error dealing with Winnt.h 据我所知,它用于为 winAPI 特定标头提供定义。在该线程上提出的解决方案之一是在包含需要这些定义的任何标题之前从不同的 Windows 标题中获取定义。

【讨论】:

问题是,winnt.h 文件不包含在类中。但是我现在已经发布了代码=]

以上是关于错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前的主要内容,如果未能解决你的问题,请参考以下文章

错误:C2146:语法错误:缺少“;”在标识符“m_Employer”之前,

错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前

C++ 编译错误 C2146 和 C4430

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

在 vc6 中使用 bison 和 flex

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