2011-09-18 140 views
2

所以我在這裏有點困惑。我工作的一個更大的項目,但遇到了一些問題,所以我用一個簡單的結構寫了一個小的測試案例:儘管返回類型定義不同,函數返回Int

#include <stdio.h> 

typedef struct{ 
    int property1; 
}test; 

int main(){ 
    test testing = getNumber(); 
    printf("%d",testing.property1); 
    return 0; 
} 

test getNumber(){ 
    test testing = {2}; 
    return testing; 
} 

所有我想要做的是從測試結構讀取屬性從getNumber()返回。但是,編譯器,錯誤如下抱怨:

test.c(8) : error C2440: 'initializing' : cannot convert from 'int' to 'test'

所以我的問題是:爲什麼這個函數試圖儘管我指定的測試返回類型返回一個int?我該如何解決?我只是盲目瞭解簡單的事情嗎?

+11

你錯過了原型 –

+0

哦,geez ..我不能相信我錯過了。謝謝大聲笑。哇。 – BraedenP

+2

@PaulR:我不想看到被別人複製/粘貼到答案框中。 – Jon

回答

5

你錯過了一個原型:

#include <stdio.h> 

typedef struct{ 
    int property1; 
}test; 

test getNumber(void); // <<< missing prototype 

int main(){ 
    test testing = getNumber(); 
    printf("%d",testing.property1); 
    return 0; 
} 

test getNumber(void){ 
    test testing = {2}; 
    return testing; 
} 
+0

是的 - 或者你可以在'main'之前定義'getNumber'。在沒有遞歸的情況下,總是有一個命令使得單獨的聲明不必要。哪一個是最好的味道和風格的問題。 –

2

這裏的錯誤消息是有點曖昧。 c函數的默認返回類型是int。編譯器報告它無法進行從inttest的轉換。但事實上,它失敗了,因爲它不知道getNumber()是什麼。編譯器錯誤信息應該更清楚一點,說undefined調用getNumber()或這些行上的一些東西。

C編譯器以自上而下的方式工作。事前使用的變量,函數調用應該事先知道。所以,當編譯器看到下面的語句 -

test testing = getNumber(); 

直到此時,它不知道getNumber()是什麼。所以,你有兩個讓編譯器高興的選擇。

  1. 要麼正向聲明函數聲明。
  2. 或移動上面的功能定義main()