2012-11-14 67 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,你应该没问题。

相关问题