2011-12-26 153 views
2

我試圖按照OReilly的「Cocoa and Objective C:Up and Running」(一種很棒的閱讀方式),但我一直在用這些令人討厭的警告進行竊聽。C:返回類型默認爲Int

例如:此代碼段(p.56-57)...

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

main() { 
    int total = 81; 
    float ratio = 1.618; 

    char* result; 
    asprintf (&result, "total: %i, ratio: %1.3f", total, ratio); 

    printf ("%s \n", result); 
    free (result); 
} 

拋出我這...

/Users/justianmeyer/Desktop/test.c:5: warning: return type defaults to ‘int’ 
/Users/justianmeyer/Desktop/test.c: In function ‘main’: 
/Users/justianmeyer/Desktop/test.c:18: warning: control reaches end of non-void function 
total: 81, ratio: 1.618 

我一直在編程了一段時間,但截至昨天,我對C/Objective C完全陌生。我一直在閱讀未聲明的方法預計會接受/返回一個默認的int,但不是main()方法應該自動聲明?爲什麼它需要默認爲int?此外,main()應該返回一個int?那有什麼用處?收到的退貨價格在哪裏?

另外:有沒有什麼辦法可以在XCode 4.2中創建「.c」文件,而無需將其包含在項目中?現在我正在使用TextMate作爲示例,但我希望在本書的過程中儘可能熟悉XCode。

+0

它告訴你,你的主要方法的定義是錯誤的。它*應該*返回'int',所以你必須聲明它'int main()'(你也應該返回一些東西,比如'return 0;') – 2011-12-26 04:36:47

+0

這很有道理。爲什麼這是公約?當回報不一定需要時,通常的做法是返回0嗎? – 2011-12-26 04:40:41

+0

只是好奇,這本書省略了返回類型嗎? – 2011-12-26 04:45:57

回答

3

我不知道ObjectiveC,但在標準C中,您必須聲明返回類型和main的參數。所以: int main(void)應該工作。大多數(所有)操作系統都希望從main返回int。

來自main的返回值是程序的退出代碼,以指示程序是否正常結束或以其他方式結束。

+2

在老C,假定功能,如果沒有類型提供給返回'int',但我認爲在Xcode中默認的編譯器模式爲C99 ,它沒有隱式的'int'規則。 – dreamlax 2011-12-26 05:07:54

2

警告是你的朋友。

它告訴你函數返回int,但你沒有返回任何東西,所以有潛在的問題。

1

C函數可以寫成

<return type a> <function name>(<type 1> <parameter 1>, ..) { 
    ... 

    return <element of type a>; 
} 

但是可以被排除在外,而是由一組規則通過它你的編譯器播放,建議到指定返回類型。

2

在較早的C中,可以定義任何函數而沒有顯式的返回類型,默認情況下,它假定返回int。功能參數也是如此。在最新版本的C標準中,隱式int已被刪除(前言的第5段)。

此外,返回類型不是void(表示函數不返回值)的任何函數必須有return語句,否則您的程序不符合。如果您希望程序以明確定義的方式運行,則一致性非常重要。 mainreturn -statement-rule的特殊例外,因此它不需要需要以具有返回語句。如果沒有提供返回語句,那麼main函數將隱式返回0(第5.1.2.2.3節)。

您的編譯器警告您,您沒有明確指定返回類型,並且該控件在不返回值的情況下到達非void函數的末尾。前者可以通過在您的代碼中放入main之前的int來輕鬆修復。後者—即使main是規則—的一個例外,同樣可以通過在返回語句中進行修正,以便與其他非void函數保持一致。

1

爲了解決這個問題,你需要int main()並返回0;在最後:

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

int main() { 
    int total = 81; 
    float ratio = 1.618; 

    char* result; 
    asprintf (&result, "total: %i, ratio: %1.3f", total, ratio); 

    printf ("%s \n", result); 
    free (result); 
    return 0; 
}