是什么错误无法理解

时间:2012-04-24 12:01:44

标签: c++ visual-studio-2010 visual-c++ pointers typedef

我制作了一个代码,但有错误并且无法解决它们: -

以下错误出现在我的一个头文件中(代码如下所示)

  

错误C2143:语法错误:缺少';'在'*'之前

     

错误C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int

     

错误C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int

头文件代码: -

#ifndef _DEVICE_SOURCE_FICARD_HH
#define _DEVICE_SOURCE_FICARD_HH

#ifndef _FRAMED_SOURCE_HH
#include "FramedSource.hh"
#endif

#include <DeviceSource.hh>

typedef struct LtagBufferEntry
{
  char *pBuffer;
  struct LtagBufferEntry *pNext;
} LBufferEntry;

class FICardDeviceParameters {
public:
    (RetEntry*)(*p_lm_lock_fn)( void *data );  //error at this line
    void (*p_lm_unlock_fn)( void *data );
    int nFICardFrameSize;
  //%%% TO BE WRITTEN %%%
};

class DeviceSourceFICard: public DeviceSource {
public:
  static DeviceSourceFICard* createNew(UsageEnvironment& env, FICardDeviceParameters fi_params,
                 DeviceParameters params);

protected:
  DeviceSourceFICard(UsageEnvironment& env, FICardDeviceParameters fi_params, DeviceParameters params);
  // called only by createNew(), or by subclass constructors
  virtual ~DeviceSourceFICard();

private:
  // redefined virtual functions:
  virtual void doGetNextFrame();

private:
  void deliverFrame();

private:
  DeviceParameters fParams;
  LBufferEntry *pData;
  char         * pRetData;
  //int nFICardFrameSize;
  FICardDeviceParameters fiParams;
};

#endif //_DEVICE_SOURCE_FICARD_HH

RetEntry的定义: -

typedef struct tagRetBuffer
{
  char *pBuffer;
  int nDataLn;
} RetEntry;

void InitBufferHandling();
void TransferBuffer( void *pBuffer );
RetEntry *lm_lock_fn( void *data );
void lm_unlock_fn( void *data );
int initLm555Settings(void);
void play();
void afterPlaying(void*);
void init_play();
void StartRTPProcess(void);

如何修复它们......

1 个答案:

答案 0 :(得分:0)

问题是编译器不知道表达式中的RetEntry

(RetEntry*)(*p_lm_lock_fn)( void *data );

您必须包含提供定义的标头,或者在当前标头中声明它。从下面的代码看来它似乎是tagRetBuffer的typedef,所以要在当前的翻译单元中声明,你需要声明struct和typedef:

struct tagRetBuffer;
typedef tagRetBuffer RetEntry;

现在,我建议你完全避免使用那些typedef,在C ++中编译器会在需要时搜索类型。你可以这样做:

struct RetEntry
{
  char *pBuffer;
  int nDataLn;
};

然后在任何地方使用RetEntry,就像它是typedef的名称一样。请注意,存在差异,但在99%的情况下您不会注意到。当你注意到它甚至可能对你有利(例如,你不能声明一个typedef,所以你需要声明 typedef的名字,然后重新定义按照这里的第一个建议输入typedef。)