2017-07-20 38 views
1

下面的代碼段在Eclipse不編譯:上編譯時顯示簡單的C代碼不起作用(typedef的相關)

typedef int Data; 
typedef struct node* Node; 
typedef struct node { 
    Data data; 
    Node next; 
}; 

int main() { 
    Node n = newNode(); 
    return 0; 
} 

Node newNode() { 
    Node newNod; 
    newNod = malloc(sizeof(struct node)); 
    if(!newNod){ 
     return NULL; 
     printf("\naa"); 
    } 
    newNod->data = 3; 
    return newNod; 
} 

的一個錯誤是

error: conflicting types for 'newNode'* (line with newNode() method declaration "Node newNode() {"). 

我很無能。怎麼了?

+2

「方法聲明」?聽起來像你正在使用C++編譯器。無論如何,它不喜歡名稱'newNode'用於函數名稱和變量名稱。 –

+0

@EugeneSh。它被用作函數名稱,但沒有變量具有該名稱... –

+0

@CavanPage正確...誤讀它。 –

回答

2

newNode的定義移到main之上[或在main之上添加newNode的前向聲明]。

在您的代碼中,編譯器在main中看到newNode的調用時,它正在使用隱式聲明。當遇到實際的定義,它不匹配

+0

這確實刪除了編譯問題,但是該函數仍然沒有做任何事情,並且也以某種方式停止了程序而沒有拋出錯誤。我在整個程序中都有'printf'語句,所以我可以告訴程序直到newNode()方法開始。 (如果我把printf放在方法的第一行,它不會觸發) –

+0

@SergeyBrin爲什麼'return NULL'後面有'printf()'?你想要代碼做什麼? –

+0

噢,別介意,打印流搞砸了......現在好了 –

0

聲明

typedef struct node { 
    Data data; 
    Node next; 
}; 

是不正確的。 typedef需要這種類型的名稱,就像您在typedef struct node* Node;中所做的那樣。 既然你只需要定義struct node沒有一個typedef,你應該刪除這個詞typedef在此聲明:

struct node { 
    Data data; 
    Node next; 
}; 
0

有一個古老的想法,被標準化之前的C語言,其中已被調用的函數,但尚未宣佈,是隱含聲明。在這種聲明中,默認返回值爲int

隱式聲明之後,出現了定義,所以編譯器很困惑。

有2個解決方案,以此,

  1. main()之前Delcare的功能,即main()之前添加

    Node newNode(); 
    

  2. main()之前移動整個newNode()的定義。

現在我們已經解決了這個問題,請注意,指針typedef是一個壞主意。從代碼中可以看出,這種類型的變量實際上是指針。而且由於它們是否是指針有一個非常重要的區別,你應該儘可能清楚。