如何修复此未声明的标识符?(C+;+;) 现在我正在用C++编写一个VST,我遇到了一个问题。我上网和StackOverflow已经有一段时间了,我被卡住了。两个文件给了我这个问题,SynthesizerTwo.h和SynthesizerTwo.cpp

如何修复此未声明的标识符?(C+;+;) 现在我正在用C++编写一个VST,我遇到了一个问题。我上网和StackOverflow已经有一段时间了,我被卡住了。两个文件给了我这个问题,SynthesizerTwo.h和SynthesizerTwo.cpp,c++,declaration,identifier,vst,C++,Declaration,Identifier,Vst,我得到的错误是: 'kNumPrograms': undeclared identifier [in SynthesizerTwo.h] 我有一个名为kNumPrograms的常量int,在synthezertwo.cpp中声明如下: #include "SynthesizerTwo.h" #pragma warning( suppress : 4101 4129 ) #include "IPlug_include_in_plug_src.h" #i

我得到的错误是:

'kNumPrograms': undeclared identifier [in SynthesizerTwo.h]
我有一个名为kNumPrograms的常量int,在synthezertwo.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
中,它在类
SynthesizerTwo
中使用,如下所示:

#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
、公共部分和私有部分。我还尝试将
.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   

任何帮助都将不胜感激。

这是预处理器包含文件后SynthezerTwo.cpp文件的样子,其中大部分被删除:

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
是在声明之前使用的。事后声明也无济于事。此外,如果您将“synthezertwo.h”包含到任何其他文件中,则根本不会有声明

解决方案:在使用变量之前声明变量


但问题是,我试着在.h和.cpp中声明它,在.h的#include之上。它给了我链接器错误,如OP中所述

如果在头中定义名称空间范围变量,则应将其声明为
inline


您已经定义了保留给语言实现的标识符。因此,您的程序的行为是未定义的(如果首先编译它的话)。你应该使用另一个头部防护装置

(char*)"-"

这似乎很危险。避免丢弃常量。

一个可能的解决方案是将
外部常量放入kNumPrograms

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;
}
#包括
//这就像一个向前的减速(在你的头上)
外部const int kNumPrograms;
void f()
{

std::cout
void SynthesizerTwo::CreatePresets()
应该是
void CreatePresets()
。将该函数的实现移动到
.cpp
文件中(在声明
kNumPrograms
之后)。无关:为什么要强制转换
(char*)“-”
而不是只调用
MakeDefaultPreset(“-”,kNumPrograms)
?谢谢,我会试试。无关:由于您链接到的框架已经存档,并且它们链接到了新框架,也许您最好从这个框架开始?是的,我决定将框架切换到iPlug2。谢谢您的帮助!为了澄清第二个问题:其中带有
\uu
的名称是为用户保留的编译器。也许有一天你在一个自己定义了
\uuuu合成器two\uuuuu
的编译器上编译它,然后你的头文件突然不起作用。但问题是,我试着在
.h
.cpp
上面的
.h
中声明它。它给了我链接器错误,正如OP.,我也在使用一个框架,而 < <代码>伴随着它。@ OBOEWANKENOBI好,现在你知道这个框架的例子被打破了。@ OboeWanKenobi在C和C++的所有标准版本中都被破坏了。如果它是在1989之前(C的标准化)写的,那么我想这个例子可以被原谅。(但也许是时候将30年历史的例子更新到现代标准了).
为很多人工作了很多年。
这是一个行为不明确的问题。仅仅表现出工作并不意味着它工作。它明天可能会突然停止工作。我不确定如何使它重现,因为除了无法联系到kNumPro之外,我不确定到底是什么导致了问题克。
#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;
}