'struct ...'没有名字的成员

时间:2015-05-11 13:04:55

标签: c struct compiler-errors

为什么我一直收到这个错误:

  

struct没有成员[-Wpedantic]
'struct check'没有成员命名   'refc'
'struct check'没有名为'valor'的成员

等。代码如下

#ifndef _ITEM_
#define _ITEM_ 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define key (a) (a != NULL ? a->refc : "")      
#define less (a,b) (strcmp (a,b)<0)
#define eq(a,b) (strcmp (a,b) == 0)
#define NULLitem NULL

typedef long int* Key;                  

typedef struct cheque {                 
    int valor
    long int refe
    long int refb
    long int* refc

}*Item;                         

Item newItem (int valor, long int refe, long int refb, long int* refc);
void deleteItem (Item a);
void visitItem (Item a);

#endif

编辑:

现在我正面临着以下错误,

  

Item.c:6:36:错误:预期';',','或')'在'refe'之前   newItem(int valor,long item refe,long item refb,long item * refc)^   Item.c:在函数'visitItem'中:

     

Item.c:32:2:警告:格式'%d'需要'int'类型的参数,但是   参数2的类型为'long int'[ - Wformat =] printf(“refe:%d \ n”,   A-&GT; refe); ^

     

Item.c:33:2:警告:格式'%d'需要'int'类型的参数,但是   参数2的类型为'long int'[ - Wformat =] printf(“refb:%d \ n”,   A-&GT; REFB);代码如下

item.h

#ifndef _ITEM_
#define _ITEM_ 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define key (a) (a != NULL ? a->refc : "")      
#define less (a,b) (strcmp (a,b)<0)
#define eq(a,b) (strcmp (a,b) == 0)
#define NULLitem NULL

typedef long int* Key;                  

typedef struct cheque {                 
    int valor;
    long int refe;
    long int refb;
    long int* refc;

}*Item;                         

Item newItem (int valor, long int refe, long int refb, long int* refc);
void deleteItem (Item a);
void visitItem (Item a);

#endif

item.c

#include "Item.h"
#include <stdio.h>
#include <stdlib.h>


Item newItem (int valor, long item refe, long item refb, long item* refc)
{

    Item x = (Item) malloc (sizeof(struct cheque));

    x->valor = valor;
    x->refe = refe;
    x->refb = refb;
    x->refc = strdup(refc);

    return x;
}


void deleteItem (Item a)
{
    free(a->refc);
    free(a);

}


void visitItem (Item a)
{

    printf("valor: %d\n", a->valor);
    printf("refe: %d\n", a->refe);
    printf("refb: %d\n", a->refb);
    printf("refc: %ld\n", a->refc);

}
  

EDIT_v2

Item newItem (int valor, long int refe, long int refb, long int* refc)

printf("valor: %d\n", a->valor);
printf("refe: %ld\n", a->refe);
printf("refb: %ld\n", a->refb);
printf("refc: %p\n", a->refc);

纠正这些错误后,我收到了以下错误:

  

Item.c:在函数'newItem'中:Item.c:14:2:警告:隐式    函数'strdup'的声明[-Wimplicit-function-declaration]

     

x-&gt; refc = strdup(refc); ^ Item.c:14:10:警告:任务使    没有强制转换的整数指针[默认启用] x-&gt; refc =    的strdup(REFC);

     

Item.c:在函数'visitItem'中:Item.c:34:2:警告:格式'%p'   期望类型为'void *'的参数,但参数2的类型为'long int   *'[ - Wformat =] printf(“refc:%p \ n”,a-&gt; refc);

Edit_ v3

修复了1个问题 校正:

x->refc = refc;

错误atm:

  

Item.c:在函数'visitItem'中:Item.c:34:2:警告:格式'%p'   期望类型为'void *'的参数,但参数2的类型为'long int   *'[ - Wformat =] printf(“refc:%p \ n”,a-&gt; refc);

2 个答案:

答案 0 :(得分:1)

你忘记了分号:

typedef struct cheque {                 
    int valor;
    long int refe;
    long int refb;
    long int* refc;    

}*Item;                         

答案 1 :(得分:1)

我认为,您的代码应该看起来像

typedef struct cheque {                 
    int valor;
    long int refe;
    long int refb;
    long int* refc;

}*Item;

使用; s。

编辑:

我认为,那是另一个错字。

Item newItem (int valor, long item refe, long item refb, long item* refc)

应该阅读

Item newItem (int valor, long int refe, long int refb, long int* refc)

然后,

printf("refe: %d\n", a->refe);
printf("refb: %d\n", a->refb);
printf("refc: %ld\n", a->refc);

有错误的格式说明符,后者又会调用undefined behaviour

long int的正确格式说明符为%ldlong int *的格式说明符为%p

另外,请malloc() C和{{1}}中的家人返回do not cast