错误C2146:语法错误:缺少';'之前标识符'ContextRecord'

问题描述:

我有一个头文件,其中包含所有类的功能,包括代码,所以该类没有cpp文件。一切正常。我添加了cpp文件,并将功能代码移到该代码中,现在编译时出现此错误。在((x86)\微软sdks \ windows \ v7.0a \ include \ winnt.h(6361))中得到错误的头文件甚至不包含在即时更改的文件中。有谁知道这可能是什么原因?我可以提供代码,我只是不知道会有帮助。错误C2146:语法错误:缺少';'之前标识符'ContextRecord'

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解决了这个问题。

+0

是的,这将有所帮助;) – mwerschy 2013-05-11 20:58:23

+2

你的类声明结尾处是否有分号? – 2013-05-11 20:59:08

+0

是的,我愿意。那是我检查的第一件事。我有其他类与cpp文件,所以我不知道为什么这一个行事。 – CalvinWylie 2013-05-11 21:00:06

错误是否也说PCONTEXT undefined

尝试在#include <X3DAudio.h>之前加入#include <Windows.h>

在回复评论约unresolved external symbol

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

+0

你可以告诉我为什么添加windows.h修正了这个问题吗? – CalvinWylie 2013-05-11 21:18:47

+0

''包含'''其中包含''它有这条线'PCONTEXT ContextRecord;'。并通过包含'#include '它定义了适当的常量以确保'PCONTEXT'被定义。 – 2013-05-11 21:22:57

+0

谢谢你。很有帮助。 – CalvinWylie 2013-05-11 21:23:51

整个代码将是有用的。你是否记得显而易见给函数的名字命名空间等?

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

etc?

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

+0

是的,我也是。以及我试过,但在cpp文件中包含“fisherman.h”会引发这个错误 – CalvinWylie 2013-05-11 21:07:51

+0

请记住在fisherman.h之前包含必要的文件,我通常包含STL/STD库,然后是外部库,如SDL等,然后头文件,但当然它可以不同,但​​仍然可以取决于你现在在做什么。 – RippeR 2013-05-11 22:45:35

很可能在这条线之前的某个地方只是错过了';'。

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

我宁愿发表评论,但显然我不被允许。

无论如何,作为一种更简单的方式,让我们感受一下你在做什么,definatley发布你的代码 - 它不必像你使用的一样,而应该是一个简洁的通用代码,突出你如何做某事。 (SSCCE)如果确实是您输入方式的错误,最好是准确地输入代码,但将其放在pastebin上并提供一个链接,以便该页面不会出现大量代码。

编辑: WINNT.H显然会引发各种问题:Weird compile error dealing with Winnt.h 它是用来为WINAPI特定的头文件提供的定义,因为据我所知。在该线程上提出的解决方案之一是在包含任何需要这些定义的头文件之前,从不同的Windows头文件获取定义。

+0

事情是,winnt.h文件不包括在类中,但我已经发布了代码,现在虽然=] – CalvinWylie 2013-05-11 21:08:42