读书人

用gcc编译时出现‘info’ undeclared

发布时间: 2012-08-14 10:39:57 作者: rapoo

用gcc编译时出现‘info’ undeclared (first use in this function)
这是小的写的代码,但是在gcc编译的时候总是出现‘info’ undeclared (first use in this function),我的info是不是还要重新定义一下?

C/C++ code
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <expat.h>#include <stdbool.h>#define bool _Bool#define false 0#define true 1#define __bool_true_false_are_defined 1#if defined(__amigaos__) && defined(__USE_INLINE__)#include <proto/expat.h>#endif#ifdef XML_LARGE_SIZE#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400#define XML_FMT_INT_MOD "I64"#else#define XML_FMT_INT_MOD "ll"#endif#else#define XML_FMT_INT_MOD "l"#endif#define BUFFSIZE        8192char Buff[BUFFSIZE];int Depth;typedef enum {  S_NONE,  S_IFNAME,  S_PROTO,  S_IPADDR,  S_NETMASK,} state_et;typedef struct {  state_et  state;  char  interface[100];  char  ifname[100];  char  proto[100];  char  ipaddr[100];  char  netmask[100];} info_st;static void XMLCALLchardata(void *userData, const XML_Char *s, int len){  info_st   *info = userData;  switch ( info->state ) {    case S_IFNAME:      strncpy(info->ifname,s,len);      info->ifname[len] = '\0';      break;    case S_PROTO:      strncpy(info->proto,s,len);      info->proto[len] = '\0';      break;    case S_IPADDR:      strncpy(info->ipaddr,s,len);      info->ipaddr[len] = '\0';      break;    case S_NETMASK:      strncpy(info->netmask,s,len);      info->netmask[len] = '\0';      break;  }  info->state = S_NONE;//  printf(">-%.*s-<",len,s);}static void XMLCALLstart(void *data, const char *el, const char **attr){   {    char temp[100];    if ( sscanf( el, "config_interface_%s", temp) == 1 ) {      strcpy(info->interface,temp);    }    if ( strcmp(el,"ifname")==0) info->state = S_IFNAME;    if ( strcmp(el,"proto")==0) info->state = S_PROTO;    if ( strcmp(el,"ipaddr")==0) info->state = S_IPADDR;    if ( strcmp(el,"netmask")==0) info->state = S_NETMASK;  }  for (i = 0; i < Depth; i++)    printf("  ", data);   if ( strcmp(el,"network") ) info->parsingNetwork = true;  info_st   *info = data;  int i;  printf("%s", el);  for (i = 0; attr[i]; i += 2) {    printf(" %s='%s'", attr[i], attr[i + 1]);  }  printf("\n");  Depth++;    }static void XMLCALLend(void *data, const char *el){  if ( strcmp(el,"network") ) {    info->parsingNetwork = true;    info->done = true;}  info_st   *info = data;  {    char temp[100];    if ( sscanf( el, "config_interface_%s", temp) == 1 ) {      printf("DATA=%s %s %s %s %s\n",             info->interface,             info->ifname,             info->proto,             info->ipaddr,             info->netmask);    }  }  Depth--;    }intmain(int argc, char *argv[]){  info_st   info = { 0 };  XML_Parser p = XML_ParserCreate(NULL);  if (! p) {    fprintf(stderr, "Couldn't allocate memory for parser\n");    exit(-1);  }  XML_SetElementHandler(p, start, end);  XML_SetCharacterDataHandler(p,chardata);  XML_SetUserData(p, &info);  for (;;) {    int done;    int len;    len = (int)fread(Buff, 1, BUFFSIZE, stdin);    if (ferror(stdin)) {      fprintf(stderr, "Read error\n");      exit(-1);    }    done = feof(stdin);    if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {      fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n",              XML_GetCurrentLineNumber(p),              XML_ErrorString(XML_GetErrorCode(p)));      exit(-1);    }    if (done)      break;  }  XML_ParserFree(p);  return 0;}


哪位能回答下,感谢!

------解决方案--------------------


static void XMLCALL
start(void *data, const char *el, const char **attr)



static void XMLCALL
end(void *data, const char *el)

里的info都要声明下,,
看你的源程序,还是把info当成全局变量把
[解决办法]
你下面的函数里面的info没声明
[解决办法]
chardata函数写对了,为何余下的函数不照着写呢?
如此行,先写在函数体内的第一行。
info_st *info = userData;
之后再用info就没问题了。

[解决办法]
在 start 和 end 函数中, info 指针没有定义就用了,但是紧随着 后面又定义了。。
[解决办法]
info,没有定义就用了。

C/C++ code
static void XMLCALLend(void *data, const char *el){  info_st   *info = data; // jernymy  if ( strcmp(el,"network") ) {    info->parsingNetwork = true;    info->done = true;}//   info_st   *info = data; // jernymy  {    char temp[100];    if ( sscanf( el, "config_interface_%s", temp) == 1 ) {      printf("DATA=%s %s %s %s %s\n",             info->interface,             info->ifname,             info->proto,             info->ipaddr,             info->netmask);    }  }  Depth--;    }
[解决办法]
代码有2个问题
1.info数据结构中没有parsingNetwork 和done 成员,所以
static void XMLCALL
end(void *data, const char *el)
函数编译时候会提示没有parsingNetwork 和done 成员
解决方案,重新定义info_st数据结构
C/C++ code
typedef struct {  state_et  state;  char  interface[100];  char  ifname[100];  char  proto[100];  char  ipaddr[100];  char  netmask[100];  bool parsingNetwork ;  bool done;} info_st; 

读书人网 >C语言

热点推荐