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

时间:2013-05-11 20:54:49

标签: c++ header xaudio2

我有一个包含所有类'的头文件。函数包括代码,所以类没有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解决了这个问题。

3 个答案:

答案 0 :(得分:8)

错误是否也说PCONTEXT undefined

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

回复有关unresolved external symbol的评论:

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

答案 1 :(得分:0)

整个代码会有所帮助。您是否记得明显要将命名空间赋予函数名称等?

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

等?

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

答案 2 :(得分:0)

在这一行之前的某个地方很可能只有一个错过的';'。

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

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

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

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