免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 20860 | 回复: 4
打印 上一主题 下一主题

[C] 请教:error C2143: syntax error : missing ';' before '<class-head>' [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-27 20:47 |只看该作者 |倒序浏览
我自己定义的头文件中,在编译时在首个结构体前抱错,类型如题。
代码如下:
#ifndef PARSE_INCLUDED
#define PARSE_INCLUDED
#define XMLCALL

#define XMLPARSEAPI __declspec(dllexport)

#ifdef __cplusplus
extern "C" {
#endif
typedef struct decl_st{
        char *version;
        int versionLen;
        /*目前在xmpp系统中,以下两种情况是不会出现的*/
        char *encoding;
        int encodingLen;
        char *standalone;
        int standaloneLen;
}XMLDECL;
/*暂且先不考虑属性含有前缀绑定的情况*/
typedef struct attribute_st{
        char *attNamePtr;
        int attNameLen;
        char *attValueStart;
        int attValueLen;
        struct attribute_st *next;
} ATTRIBUTE;

typedef struct binding_st{
        char *prefix;
        int prefixLen;
        char *uri;
        int uriLen;
        int level;//声明该命名空间的元素深度,当深度倒推出该深度,则需要从链表中删除该前缀绑定了
        struct binding_st* next;
}BINDING;

typedef struct tag_st{
        char *elementName;       
        char *prefix;       
        char *localName;
        char *uri;
        char **attrs;//这里有空间的开辟
        int iAttr;
        int elementLen;
        int prefixLen;
        int localNameLen;
        int uriLen;
        int tagDepth;
} TAG;

typedef struct dtd_st{
        int dtd;
        /*here  we used to store the hashtable that contain the element and others*/
        /*貌似该结构体还是有一定作用的,存储了解析过程中的元素名,我们希望用这个结果拿来做什么?*/
        /*都馈送到上级应用了,这里留着也没什么用了吧。*/
} DTD;

/*出错是个大问题,容易忽视,但却极其重要!*/
typedef struct position_st{
        int lineNumber;
        int columnNumber;
} POSITION;

typedef struct  strpool_st{
        char *pool_start;
        char *pool_end;
        char *event_start;
        char *event_end;
        char *pool_now;
        int blockLen;
        int eventLen;
} STRING_POOL;

/*传入参数需要更改到与接口一致*/
/*come from expat*/
typedef void (XMLCALL *XML_StartElementHandler) (void *userData,const char *name,const char **atts);

typedef void (XMLCALL *XML_EndElementHandler) (void *userData,const char *name);

typedef void (XMLCALL *XML_StartNamespaceDeclHandler) (void *userData,const char *prefix,const char *uri);

typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData,const char *s,int len);

/*****************/

struct XML_ParserStruct{
        void *userData;
        void *handlerArg;
        XML_StartElementHandler startElementHandler;
        XML_CharacterDataHandler characterDataHandler;
        XML_EndElementHandler endElementHandler;
        XML_StartNamespaceDeclHandler startNamespaceDeclHandler;
        enum XML_Error errorCode;
/*
        标签栈,存放元素名的相关信息,应当包括其属性结构体、前缀,uri,深度,
        没有必要将所有元素的信息都存储下来,父元素不需要知道子元素的任何信息,
        子元素也只需要父元素命名空间的支持。一般情况下都默认为父元素声明的
        命名空间。因而这里不需要建元素链表的操作,也不需要对子元素的信息进行记录。
*/
        int tagLevel;
        char **elemStack;//存储组装后的元素名,便于结尾标签的处理
        BINDING *binding;//对前缀绑定进行建链操作,命名空间的声明都按顺序存储在这里
        XMLDECL *xmldecl;
        POSITION *position;
        STRING_POOL *nowXml;//存储当前的xml数据
        STRING_POOL *remainBuf;//本轮解析完毕,遗留数据存放的位置
        STRING_POOL *tempValue;//存储需要转义,以及转义后的数据,包括字符内容和属性值
};
typedef struct XML_ParserStruct *XML_Parser;
int _cake_realloc(char **oblocks,int len);

//define几个小函数,便于代码的编写
#define ESCAPESPACE(ptr)    { while(*ptr==0x20||*ptr==0xA||*ptr==0xD||*ptr==0x09) {if(*ptr==0xA){XML_UpdatePosition(parser);}ptr++;}}
#define CHECKPARTIAL(ptr)   {if((ptr>bufEnd)&&(ptr==NULL)||(*ptr==NULL)) return XML_ERROR_PARTIAL;}
#define FINDTAGEND(ptr)     {while((ptr!=NULL)&&(ptr<=bufEnd)&&(*ptr!=NULL)&&(*ptr!='>')){if(*ptr==0xA){XML_UpdatePosition(parser);}ptr++;}}
#define FINDTAGSTART(ptr)        {while((ptr!=NULL)&&(ptr<=bufEnd)&&(*ptr!=NULL)&&(*ptr!='<')){if(*ptr==0xA){XML_UpdatePosition(parser);}ptr++;}}
#define CAKE_SAFE(blocks,nowsize,len,addLen) {if ((nowsize) > len) len = _cake_realloc((char**)&(blocks),(nowsize),(addLen));}

/*声名内部所需的函数*/
int XMLCALL getXmlBuf(XML_Parser,char*,int);
int XMLCALL getRemainBuf(XML_Parser);
int XMLCALL storeRemainxml(XML_Parser,char*,char*);

int XMLCALL startParse(XML_Parser);

int XMLCALL declParse(XML_Parser,char *,char *,char *);
int XMLCALL commentParse(XML_Parser,char *,char *,char *);
int XMLCALL contentParse(XML_Parser,char *,char *,char *);
int XMLCALL tokenParse(XML_Parser,char *,char *,char *,int);
int XMLCALL startTokenParse(XML_Parser,char *,char *,char **);
int XMLCALL endTokenParse(XML_Parser,char *,char *,char **);
int XMLCALL attributeParse(XML_Parser,TAG*,char *,char *);

int XMLCALL characterParser(XML_Parser,char*,char*,char**);

int XMLCALL getEscape(STRING_POOL*);
char XMLCALL getEscapeCh(char*,int);

int XMLCALL checkNamespace(char*,char*);

int XMLCALL addNamespace(XML_Parser ,BINDING* ,char* ,char* ,char* ,char*,int);
int XMLCALL addAttribute(XML_Parser,TAG* ,char* ,char* ,char* ,char* );
int XMLCALL addBinding(XML_Parser,BINDING*,int);
int XMLCALL updateBindingList(XML_Parser,int);

int XMLCALL getBinding(XML_Parser,TAG*);
char* XMLCALL getElementName(TAG*);
BINDING * XMLCALL findBinding(BINDING* ,TAG* );

int XMLCALL freeBinding(BINDING*);

int XMLCALL freeTag(TAG*);

/*声明被外部调用的函数*/
XMLPARSEAPI XML_Parser XMLCALL parserCreate(int);
XMLPARSEAPI        int XMLCALL XML_Parse(XML_Parser parser, const char *s, int len, int isFinal);

/*        XML_Parser XMLCALL parserCreate(char istream);*/

XMLPARSEAPI        enum XML_Error XMLCALL XML_GetErrorCode(XML_Parser parser);

XMLPARSEAPI        void XMLCALL XML_ParserFree(XML_Parser parser);

XMLPARSEAPI        const char * XMLCALL XML_ErrorString(enum XML_Error code);

XMLPARSEAPI void XML_SetUserData(XML_Parser parser, void *userData);
XMLPARSEAPI unsigned long XML_GetCurrentLineNumber(XML_Parser parser);

XMLPARSEAPI void XML_SetElementHandler(XML_Parser parser,XML_StartElementHandler startElementHandler,XML_EndElementHandler endElementHandler);
XMLPARSEAPI        void XML_SetCharacterDataHandler(XML_Parser parser,XML_CharacterDataHandler characterDataHandler);
XMLPARSEAPI        void XML_SetStartNamespaceDeclHandler(XML_Parser parser,XML_StartNamespaceDeclHandler startNamespaceDeclHandler);

       

#ifdef __cplusplus
}
#endif

#endif
我查阅了网上的相关资料,主要处理有:
1、前面包含的头文件有问题,但是我定义的头文件中未包含其他任何头文件,此种情况可以排除。
2、前面其他的定义有问题,在此该结构体前仅有两个#define语句,在此排除。
3、定义的结构体typedef等拼写出错,这也不可能出现,在此排除。
4、定义的结构体结尾漏掉了分号,这也不可能出现,在此排除。
5、定义的结构体中含有不可识别的类型,该结构体种只有int,char两种类型,该情况也可以排除。
在此等待高人在线指点!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-11-28 00:37 |只看该作者
都不知道是哪行报的错。

论坛徽章:
0
3 [报告]
发表于 2008-11-28 08:20 |只看该作者
就是啊,编译器应该都能指出那行报错吧。

论坛徽章:
0
4 [报告]
发表于 2008-11-28 09:02 |只看该作者

回复 #1 cake918 的帖子

不好意思,麻烦大家了,vc2003真的不好用,它就是不能正确指出错误在哪儿!实际上是我的另一个头文件(未在该头文件中包括)中的数组定义结尾丢了分号!

论坛徽章:
0
5 [报告]
发表于 2008-11-28 09:51 |只看该作者
原帖由 cake918 于 2008-11-28 09:02 发表
不好意思,麻烦大家了,vc2003真的不好用,它就是不能正确指出错误在哪儿!实际上是我的另一个头文件(未在该头文件中包括)中的数组定义结尾丢了分号!



呵呵,VC也有这个问题的,但是一般会说是那行啊,不过也不准,有时是其他原因引起,需要再往前找。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP