【问题标题】:Whats the errors not able to understand什么错误无法理解
【发布时间】:2012-04-24 12:01:43
【问题描述】:

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

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

错误 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);

如何解决它们...

【问题讨论】:

  • 我假设它会告诉您与此错误相关的特定行?
  • 我猜RetEntry 在错误发生时是未定义的。缺少#include 吗?
  • 行号会有所帮助,但这个“C++ 不支持默认整数”让您清楚地知道您在寻找什么!
  • 哇,这是可怕的 C++ 代码。
  • 上面提到的所有三个错误(在代码中):- (RetEntry*)(*p_lm_lock_fn)( void *data );

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


【解决方案1】:

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

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

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

struct tagRetBuffer;
typedef tagRetBuffer RetEntry;

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

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

然后在任何地方使用RetEntry,就好像它是一个经过类型定义的名称。请注意,存在差异,但在 99% 的情况下您不会注意到。当您确实注意到它甚至可能对您有利时(例如,您不能 declare typedef,因此您需要 declare typedef 的名称,然后重新定义typedef 按照这里的第一个建议)。

【讨论】:

  • 我包含了定义 RetEntry 的标头现在我收到错误:-error C2011: 'tagRetBuffer' : 'struct' type redefinition
  • @Harry,这意味着您正在重新定义翻译单元中的结构。您是否多次包含该标题?标题是否包含警卫? (触发相同错误的等效代码:struct X {}; struct X {}; --note 都 define 结构,即使它们将其定义为相同,这是不允许的。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2022-06-19
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多