2012-11-14 95 views
1

只是學習Java背景下的Objective-C。我試圖編寫一個沒有其他目的的程序,然後教我如何編寫這種語言的函數,並且我在任何地方都遇到錯誤。問題是因爲我昨天剛開始使用這種語言,這些錯誤對我來說毫無意義。這是我到目前爲止。爲什麼編譯器會抱怨我的簡單函數調用?

主要方法:

int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool 
    { 
     NSString * prompt = @"Hello World"; 

     prompt = writePromptMessage(prompt); 

     NSLog(@"%@", prompt); 
    } 

    return 0; 
} 

特殊方法:

NSString *writePromptMessage(NSString * prompt) 
{ 
    return prompt; 
} 

我的錯誤:

  • 功能writePromp的隱式聲明tMessage是在C99無效
  • '詮釋' 到 '的NSString *' 的隱式轉換是不允許與ARC
  • 不完整的整數指針轉換從int
  • 衝突的類型爲writePromptMessage
+1

您的函數需要在'main'之前聲明。 – Mat

回答

4

不同於分配的NSString強Java,您需要在使用它之前添加一個函數聲明(也稱爲函數原型)。一個函數的聲明就像函數的定義,但沒有函數體(即代碼),並用分號結尾:

// This is a function declaration: 
NSString *writePromptMessage(NSString * prompt); 

// This is a function definition: 
NSString *writePromptMessage(NSString * prompt) 
{ 
    // Function body goes here 
} 

爲了能夠調用的函數,你需要有前書面聲明使用場所:

NSString *writePromptMessage(NSString * prompt); // declaration 

int main (int argc, const char * argv[]) 
{ 
    ... 
    writePromptMessage(...); // usage 
} 

// definition follows 

或者,你可以把使用場所前的整個定義,但是這並不總是可能的(例如,如果你有兩個功能,這可以相互調用)。

C和Objective-C實際上已允許您呼叫沒有可見聲明的功能,但是這被認爲是過時的功能,因爲它很容易被濫用並導致細微的錯誤:

如果一個函數被調用沒有可見的聲明,編譯器創建一個隱 聲明

  • 隱式聲明發生的參數
  • 隱式聲明的任意數量和類型的返回int

那麼,什麼情況是,編譯器假設,當它第一次看到它writePromptMessage回報int,這是錯誤的,並導致其他錯誤的級聯。對於不返回int的函數,您必須使用從不使用隱式函數聲明,並且對於返回int的函數,應該從不使用隱式函數聲明。

+0

因此,基本上我需要首先對我在main中使用的所有方法進行排序。然後寫我的主要方法。然後寫我的方法體? – gmustudent

2

您可能需要在main之前添加函數聲明,或者在那裏定義整個函數。作爲一個例子,這個編譯:

#import <Foundation/Foundation.h> 

void hello(NSString *text) { 
    NSLog(@"%@", text); 
} 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     hello(@"Foo"); 
    } 
    return 0; 
} 

所以做到這一點:

#import <Foundation/Foundation.h> 

void hello(NSString*); 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     hello(@"Foo"); 
    } 
    return 0; 
} 

void hello(NSString *text) { 
    NSLog(@"%@", text); 
} 

編譯器會自動注意到Objective-C的方法that’s a different thing),所以沒有必要宣佈那些提前;該編譯罰款:

@interface Foo : NSObject 
@end 

@implementation Foo 

- (void) doA 
{ 
    [self doB]; 
} 

- (void) doB 
{} 

@end 

顯然編譯器是不是這個聰明普通的C函數,可能是保持與C語言規範一致。

1

所有這些錯誤很可能來自同一個問題。看來您還沒有在之前聲明或定義writePromptMessage您的main方法。在C(和Objective-C)中,您必須在使用它們之前聲明或定義函數。編譯器不知道任何關於writePromptMessage,導致您的錯誤消息。

功能writePromptMessage的隱式聲明是無效的C99

意味着你還沒有宣佈writePromptMessage,所以......

'詮釋' 的

隱式轉換到「的NSString * '被禁止使用ARC

在C中,函數假定返回一個默認10個;由於您尚未聲明writePromptMessage,因此編譯器會認爲它是返回int的函數,該函數不應轉換爲NSString *

不完整的整數指針轉換從int

參見上述分配的NSString強(它基本上是相同的問題)。

衝突的類型爲writePromptMessage

哦!現在編譯器看到writePromptMessage ......但是等等。它已經假定writePromptMessage返回了int,現在它看到它返回NSString,導致錯誤。


如果你把writePromptMessage定義之前main,或至少聲明其原型,點菜:

NSString *writePromptMessage(NSString * prompt); 

main,你應該沒問題。

相關問題