如何修复这个未声明的标识符? (C++)
How do I fix this undeclared identifier? (C++)
我目前正在用 C++ 编写 VST,我 运行 遇到了一个问题。我已经在网上和 Whosebug 上冲浪了一段时间,但我被卡住了。两个文件给了我问题,SynthesizerTwo.h
和 SynthesizerTwo.cpp
.
我得到的错误是:
'kNumPrograms': undeclared identifier [in SynthesizerTwo.h]
我有一个名为 kNumPrograms 的 const int,在 SynthesizerTwo.cpp:
中这样声明
#include "SynthesizerTwo.h"
#pragma warning( suppress : 4101 4129 )
#include "IPlug_include_in_plug_src.h"
#include "IControl.h"
#include "resource.h"
const int kNumPrograms = 1; //Original Declaration
enum EParams
{
kNumParams
};
然后,在SynthesizerTwo.h
中,在classSynthesizerTwo
中这样使用:
#ifndef __SYNTHESIZERTWO__
#define __SYNTHESIZERTWO__
#include "Oscillator.h"
#include "MIDIReceiver.h"
#pragma warning( suppress : 4101 4129 )
#include "IPlug_include_in_plug_hdr.h"
class SynthesizerTwo : public IPlug
{
public:
SynthesizerTwo(IPlugInstanceInfo instanceInfo);
~SynthesizerTwo();
//const int kNumPrograms = 5;
void Reset();
void OnParamChange(int paramIdx);
void ProcessDoubleReplacing(double** inputs, double** outputs, int nFrames);
// to receive MIDI messages:
void ProcessMidiMsg(IMidiMsg* pMsg);
private:
double mFrequency;
void SynthesizerTwo::CreatePresets() {
MakeDefaultPreset((char*)"-", kNumPrograms); //This is what gives me the error
}
Oscillator mOscillator;
MIDIReceiver mMIDIReceiver;
};
#endif
我尝试将声明放入 .h 文件,但随后出现 LNK2019 链接器错误。我也尝试在 .cpp.
和 .h
.
声明之前使用 extern
我试过将声明放在 .h
、public 部分和私有部分中的 class 之外。我也尝试将 .cpp
中的声明移到 .h
#include
上方,但我仍然遇到错误。
链接器错误:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "public: void __thiscall MIDIReceiver::advance(void)" (?advance@MIDIReceiver@@QAEXXZ) referenced in function "public: virtual void __thiscall SynthesizerTwo::ProcessDoubleReplacing(double * *,double * *,int)" (?ProcessDoubleReplacing@SynthesizerTwo@@UAEXPAPAN0H@Z) SynthesizerTwo-vst2 C:\wdl-ol\IPlugExamples\SynthesizerTwo\SynthesizerTwo.obj 1
如有任何帮助,我们将不胜感激。
这是您的 SynthesizerTwo.cpp 文件在 pre-processor 包含文件后的样子,其中大部分被删除:
class SynthesizerTwo : public IPlug
{
...
double mFrequency;
void SynthesizerTwo::CreatePresets() {
MakeDefaultPreset((char*)"-", kNumPrograms); //This is what gives me the error
}
...
const int kNumPrograms = 1; //Original Declaration
如您所见,kNumPrograms
在声明之前使用。之后声明它没有帮助。此外,如果您将“SynthesizerTwo.h”包含到任何其他文件中,则根本不会有声明。
解决方案:在使用前声明变量。
But the thing is, I've tried declaring it in the .h and in the .cpp above the .h's #include. It gave me linker errors, as stated in the OP.
如果在 header 中定义命名空间范围变量,则应将其声明为 inline
.
#define __SYNTHESIZERTWO__
您已经定义了一个为语言实现保留的标识符。因此,您的程序的行为是未定义的(如果它首先编译的话)。你应该使用另一个 header 守卫。
(char*)"-"
这看起来很危险。避免抛弃常量。
一种可能的解决方案是将 extern const int kNumPrograms;
放在 class 之前的 header 中。
extern会起到前向声明的作用,问题就解决了。
例如:
#include <iostream>
//this act like a forward decleration (in your header)
extern const int kNumPrograms;
void f()
{
std::cout<< kNumPrograms <<std::endl;
}
//real decleration come after (in your cpp)
const int kNumPrograms = 1;
int main()
{
f();
return 0;
}
我目前正在用 C++ 编写 VST,我 运行 遇到了一个问题。我已经在网上和 Whosebug 上冲浪了一段时间,但我被卡住了。两个文件给了我问题,SynthesizerTwo.h
和 SynthesizerTwo.cpp
.
我得到的错误是:
'kNumPrograms': undeclared identifier [in SynthesizerTwo.h]
我有一个名为 kNumPrograms 的 const int,在 SynthesizerTwo.cpp:
中这样声明#include "SynthesizerTwo.h"
#pragma warning( suppress : 4101 4129 )
#include "IPlug_include_in_plug_src.h"
#include "IControl.h"
#include "resource.h"
const int kNumPrograms = 1; //Original Declaration
enum EParams
{
kNumParams
};
然后,在SynthesizerTwo.h
中,在classSynthesizerTwo
中这样使用:
#ifndef __SYNTHESIZERTWO__
#define __SYNTHESIZERTWO__
#include "Oscillator.h"
#include "MIDIReceiver.h"
#pragma warning( suppress : 4101 4129 )
#include "IPlug_include_in_plug_hdr.h"
class SynthesizerTwo : public IPlug
{
public:
SynthesizerTwo(IPlugInstanceInfo instanceInfo);
~SynthesizerTwo();
//const int kNumPrograms = 5;
void Reset();
void OnParamChange(int paramIdx);
void ProcessDoubleReplacing(double** inputs, double** outputs, int nFrames);
// to receive MIDI messages:
void ProcessMidiMsg(IMidiMsg* pMsg);
private:
double mFrequency;
void SynthesizerTwo::CreatePresets() {
MakeDefaultPreset((char*)"-", kNumPrograms); //This is what gives me the error
}
Oscillator mOscillator;
MIDIReceiver mMIDIReceiver;
};
#endif
我尝试将声明放入 .h 文件,但随后出现 LNK2019 链接器错误。我也尝试在 .cpp.
和 .h
.
extern
我试过将声明放在 .h
、public 部分和私有部分中的 class 之外。我也尝试将 .cpp
中的声明移到 .h
#include
上方,但我仍然遇到错误。
链接器错误:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "public: void __thiscall MIDIReceiver::advance(void)" (?advance@MIDIReceiver@@QAEXXZ) referenced in function "public: virtual void __thiscall SynthesizerTwo::ProcessDoubleReplacing(double * *,double * *,int)" (?ProcessDoubleReplacing@SynthesizerTwo@@UAEXPAPAN0H@Z) SynthesizerTwo-vst2 C:\wdl-ol\IPlugExamples\SynthesizerTwo\SynthesizerTwo.obj 1
如有任何帮助,我们将不胜感激。
这是您的 SynthesizerTwo.cpp 文件在 pre-processor 包含文件后的样子,其中大部分被删除:
class SynthesizerTwo : public IPlug
{
...
double mFrequency;
void SynthesizerTwo::CreatePresets() {
MakeDefaultPreset((char*)"-", kNumPrograms); //This is what gives me the error
}
...
const int kNumPrograms = 1; //Original Declaration
如您所见,kNumPrograms
在声明之前使用。之后声明它没有帮助。此外,如果您将“SynthesizerTwo.h”包含到任何其他文件中,则根本不会有声明。
解决方案:在使用前声明变量。
But the thing is, I've tried declaring it in the .h and in the .cpp above the .h's #include. It gave me linker errors, as stated in the OP.
如果在 header 中定义命名空间范围变量,则应将其声明为 inline
.
#define __SYNTHESIZERTWO__
您已经定义了一个为语言实现保留的标识符。因此,您的程序的行为是未定义的(如果它首先编译的话)。你应该使用另一个 header 守卫。
(char*)"-"
这看起来很危险。避免抛弃常量。
一种可能的解决方案是将 extern const int kNumPrograms;
放在 class 之前的 header 中。
extern会起到前向声明的作用,问题就解决了。
例如:
#include <iostream>
//this act like a forward decleration (in your header)
extern const int kNumPrograms;
void f()
{
std::cout<< kNumPrograms <<std::endl;
}
//real decleration come after (in your cpp)
const int kNumPrograms = 1;
int main()
{
f();
return 0;
}