代码之家  ›  专栏  ›  技术社区  ›  damir

指向函数的指针出现gcc警告(指针类型不兼容)

c
  •  1
  • damir  · 技术社区  · 16 年前

    我需要帮助gcc警告,看起来我做错了什么

    unsigned long convert_syslog(char *date,int year) {
        char withyear[1024];
        struct tm tm;
        time_t epoch = (time_t) NULL;
    
        snprintf(withyear,sizeof(withyear),"%s %i",date,year);
        if(strptime(withyear,"%b %d %H:%M:%S %Y",&tm)) {
                epoch = mktime(&tm);
                printf("%u\n",epoch);
        }
        return epoch;
    }
    
    unsigned long convert_tai64(char *date,int year) {
        char hex[16];
        unsigned long u;
        strcpy(hex,"0x");
        strcat(hex,strndup(date+8,8));
        return strtoul (hex,NULL,16);
    }
    
    unsigned long convert_nagios(char *date,int year) {
        return strtoul(date,NULL,10);
    }
    
    unsigned long convert_clf(char *date,int year) {
        struct tm tm;
        time_t epoch = (time_t)NULL;
    
        if(strptime(date,"%d/%b/%Y:%H:%M:%S",&tm)) {
                epoch = mktime(&tm);
        }
        return epoch;
     }
    
    
    
    
    typedef unsigned long (*func)(char *data,int year);
    
    func *convert_date(int pos) {
        switch(pos) {
                case 0: return &convert_syslog;
                case 1: return &convert_tai64;
                case 2: return &convert_clf;
                case 3: return &convert_nagios;
                default: return NULL;
        }
    }
    

    pcre_search.c:57: warning: return from incompatible pointer type  (case 0)  
    pcre_search.c:58: warning: return from incompatible pointer type   (...)
    pcre_search.c:59: warning: return from incompatible pointer type   (...)
    pcre_search.c:60: warning: return from incompatible pointer type   (default)
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Joan Rieu    16 年前

    你应该回来 func func* .

        2
  •  1
  •   bjg    16 年前

    func typedef已经是指向函数的指针,因此convert\u date可以这样声明:

    func convert_date(int pos) { ...
    

    func convert_date(int pos) {
           switch(pos) {
               case 0: return convert_syslog;
               case 1: return convert_tai64;
               case 2: return convert_clf;
               case 3: return convert_nagios;
               default: return (func)NULL;
           }
       }