如何修复这个未声明的标识符? (C++)

How do I fix this undeclared identifier? (C++)

我目前正在用 C++ 编写 VST,我 运行 遇到了一个问题。我已经在网上和 Whosebug 上冲浪了一段时间,但我被卡住了。两个文件给了我问题,SynthesizerTwo.hSynthesizerTwo.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;
}