2012-09-24 68 views
1

當我運行下面的代碼:如何在c中使用typedef聲明函數時刪除未聲明的函數錯誤?

typedef char *lrfield(); 

struct lrfields { 
char name[26]; 
lrfield *f; 
}; 

struct lrfields lr_table[] = { 
    {"pri_tran_code1", pri_tran_code2}, 
    {"sec_tran_code", sec_tran_code}, 
    {"type_code", type_code}, 
    {"sys_seq_nbr", sys_seq_nbr}, 
    {"authorizer", authorizer}, 
    {"void_code", void_code}, 
    {"",0} 
}; 

char *pri_tran_code2() 
{ 
    return pri_tran_code; 
} 

* 
* 

if(second) 
{ 
    for(bp=lr_table; bp->name[0]; bp++) 
    if(strcmp(bp->name, second)==0) 
    { 
     tmpval=bp->f(); 
     break; 
    } 
} 

我有這些錯誤:

error: `pri_tran_code2' undeclared here (not in a function) 
error: initializer element is not constant 
error: (near initialization for `lr_table[0].f') 
error: initializer element is not constant 
error: (near initialization for `lr_table[0]') 
error: initializer element is not constant 
error: (near initialization for `lr_table[1]') 

正如你在我已經定義了呼叫上面的「pri_tran_code2」的代碼中看到。請幫我解決這個錯誤。

+0

問題是當你的編譯器到達第一次提到'pri_tran_code2'時,這個函數真的沒有聲明* yet *。你必須在聲明你的'lr_table []'數組之前爲函數原型化。還要修復H2CA提到的typedef – Eregrith

+0

按照Michael Krelin的回答,在聲明函數之前,您仍然會面臨「錯誤:初始化元素不是常量」問題。您只能使用不是常量表達式的'pri_tran_code2'等來初始化函數範圍內的結構成員,而不是文件範圍。 –

回答

3

添加char *pri_tran_code2();你提到這個名字之前?或者只是將整個實施移到那裏。無論你在哪裏致電它,重要的是你在哪裏提到它。

+0

謝謝,它的工作原理。我已經在錯誤的地方宣佈了這個功能。 –

3

您的聲明是錯誤的。要聲明一個函數(函數指針)類型,試試這個來代替:

typedef char *(*lrfield)(); 
+2

但是錯誤不是關於聲明,而是關於'pri_tran_code2'缺少聲明? –

+0

@ MichaelKrelin-黑客 - 儘管如此,typedef是錯誤的。如果沒有typedef,則不能聲明該類型的變量/字段/函數。所以這可能實際上有幫助。 :) – 2012-09-24 14:44:35

+0

我永遠不會記住語法,但不是原始的typedef定義函數的類型,而'lrfield *'是一個指針?由於缺乏編譯器對此的抱怨,我可以告訴它,它有效嗎? (並且不,在聲明之前不可能幫助使用函數,無論如何:)) –