- 论坛徽章:
- 0
|
我自己定义的头文件中,在编译时在首个结构体前抱错,类型如题。
代码如下:
#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两种类型,该情况也可以排除。
在此等待高人在线指点! |
|