2

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;
}

私のエラー:

  • 関数writePromptMessageの暗黙の宣言はC99では無効です
  • 'int'から'NSString*'への暗黙の変換はARCでは許可されていません
  • intから強いNSStringを割り当てる不完全な整数からポインタへの変換
  • writePromptMessageの競合するタイプ
4

3 に答える 3

4

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

または、定義全体を使用サイトの前に配置することもできますが、これが常に可能であるとは限りません(たとえば、相互に呼び出すことができる2つの関数がある場合)。

CとObjective-Cを使用すると、実際には宣言が表示されていない関数を呼び出すことができますが、誤用されやすく、微妙なエラーが発生しやすいため、これは非推奨の機能と見なされます。

目に見える宣言なしで関数が呼び出された場合、コンパイラは暗黙の宣言を作成します。

  • 暗黙の宣言は、任意の数とタイプのパラメーターを取ります
  • 暗黙の宣言はint

したがって、何が起こったのかというと、コンパイラーは、最初にそれを見つけたときにそれがwritePromptMessage戻ると想定してintいるということです。これは間違っており、他のエラーのカスケードを引き起こします。を返さない関数intの場合は、暗黙の関数宣言を使用しないでください。また、を返す関数int場合は、暗黙の関数宣言を使用しないでください

于 2012-11-14T16:43:35.853 に答える
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メソッドこれは別のものです)に自動的に気付くので、事前にそれらを宣言する必要はありません。これは正常にコンパイルされます:

@interface Foo : NSObject
@end

@implementation Foo

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

- (void) doB
{}

@end

どうやら、コンパイラは通常のC関数についてはそれほど賢くはなく、おそらくC言語の仕様に準拠していると思われます。

于 2012-11-14T16:45:18.757 に答える
1

これらのエラーはすべて、同じ問題が原因である可能性があります。メソッドのwritePromptMessage 前に宣言または定義していないようです。mainC(およびObjective-C)では、関数を使用する前に、関数を宣言または定義する必要があります。コンパイラはについて何も知らないためwritePromptMessage、エラーメッセージが表示されます。

関数writePromptMessageの暗黙の宣言はC99では無効です

宣言していないことを意味するwritePromptMessageので...

'int'から'NSString*'への暗黙の変換はARCでは許可されていません

Cでは、関数はintデフォルトでを返すと想定されています。まだ宣言していないのでwritePromptMessage、コンパイラはそれがを返す関数であると想定しますがint、これはに変換されるべきではありませんNSString *

intから強いNSStringを割り当てる不完全な整数からポインタへの変換

上記を参照してください(基本的に同じ問題です)。

writePromptMessageの競合するタイプ

おー!これでコンパイラ確認しましたwritePromptMessage...しかし待ってください。すでにがwritePromptMessage返されたと想定していたのintですが、今はそれが返されていることがわかりNSString、エラーが発生します。


の定義をwritePromptMessage mainに置くか、少なくともそのプロトタイプを宣言する場合、àla:

NSString *writePromptMessage(NSString * prompt);

前に main、あなたは大丈夫でなければなりません。

于 2012-11-14T16:46:32.890 に答える