2010-08-06 57 views
2

正如标题所说,在编译时不断收到此错误。从谷歌上搜索这个错误的人说,这是不是在头文件中声明,但我的功能是静态的,它不是在头文件,我原型it.`编译器错误在'*'标记之前的C:expected')'

#include <recGbl.h> 
#include <devSup.h> 
#include <devLib.h> 
#include <drvIpac.h> 
#include <dbScan.h> 
#include <epicsExport.h> 

static int cardinit(cardinfo *card); // <-- line that gives the error 

typedef struct cardinfo{ 
    struct cardinfo *next; 

    struct io_mem_read *pMem; /* IP register (A16) mem address */ 
    word *rambase;    /* RAM conversion memory mem address*/ 

    int isconfigured; 
    int doram; /* 1 if we are using the RAM to output data. 
      0 if we are writing to registers (AO style) */ 

    int cardnum; 
    int vmeslotnum; 
    int ipslotnum; 


    /* these values mirror the hardware registers */ 
    word csr; 
    word offset; 
    word numconv; 
    word clockrate; 
    word vectnum; 


    word dacval[MAXSIGNAL]; 

    word oldispresent; 
    /* used to detect a reinsertion of a carrier card. 
    see subroutine ispresent() below. */ 

    /* use to update process variables */ 
    IOSCANPVT ioscanpvt; 
} cardinfo; 

static int Hy8402init(int vmeslot, int ipslot, int clockrate) { 
    cardinfo *card; 

    card->vmeslotnum = vmeslot; 
    card->ipslotnum = ipslot; 
    card->cardnum = 1; 

    card->clockrate = clockrate; 
    card->vectnum = 10; 

    cardinit(card); 

return TRUE; 
} 

static int cardinit(cardinfo *card){ 
    word rprobe; 
    int res; 
    volatile word *ramptr; 

    card->pMem= ipmBaseAddr(card->vmeslotnum, 
       card->ipslotnum,ipac_addrIO); 
    if (card->pMem==NULL){ 
    printf("Error in %s",devstr); 
    printf("%s: Cannot determine base address\n",devstr); 
    return FALSE; 
    } 

    res=devReadProbe(sizeof (word),(char *) card->pMem,(char *) &rprobe); 
    if (res!=OK){ 
    printf("%s: NO DEVICE at %x (vmeslot %d, ipslot %d)\n",devstr, 
     (int)card->pMem, 
     card->vmeslotnum,card->ipslotnum); 
    return FALSE; 
    } 
return TRUE; 
} 

`

回答

16

cardinfo结构在错误行上仍未定义。把预先声明之前:

struct cardinfo; 
static int cardinit(struct cardinfo *card); 
+0

打我吧;) – 2010-08-06 16:01:04

+1

在C90中,有必要说static int cardinit(struct cardinfo * card);'带前向声明。这在C99中仍然如此吗? – 2010-08-06 16:03:02

+0

最初编译为虚拟代码为C++,将其改为c并且是,看起来'struct'确实是必需的 – Vladimir 2010-08-06 16:11:48

8

这行代码:

static int cardinit(cardinfo *card); 

应该在cardinfo结构的定义之后添加。

4

你需要放线

static int cardinit(cardinfo *card); 

cardinfo结构的定义之后。

1

在那一行,编译器还不知道cardinfo是一个结构。在它的前面加上struct cardinfo;

0

你已经声明了一个函数,它有一个类型的输入变量,当编译器解析它时,它是不知道的。即结构定义遵循你的函数声明。 所以,当你想编译这样的代码时,请做一个结构的前向声明。

在计算机程序中,前向声明是一个标识符的声明 (表示一个实体,如一个类型,一个变量或函数 )的量,程序员还没有给出了完整的定义。

link有一个很好的文章,当不需要完整的声明。

相关问题