3

ここでgccを使用してフォームを取得したこのコードをコンパイルしようとすると、次のようになります。

#import <stdio.h>
#import <objc/Object.h>

@interface Hello: Object
- (void) init;
- (void) say;
@end

@implementation Hello
- (void) init {
  [super init];
}
- (void) say {
  printf("Hello, world!\n");
}
@end

int main() {
  Hello *hello = [Hello new];
  [hello say];
  [hello free];
  return 0;
}

コマンド行あり:g ++ -x Objective-c ++ test.mm -otest -lobjc

コンパイルすると、次の警告が表示されます。

test.mm:11:14: warning: ‘Object’ may not respond to ‘-init’ [enabled by default]
test.mm:11:14: warning: (Messages without a matching method signature
[enabled by default]
test.mm:11:14: warning: will be assumed to return ‘id’ and accept
[enabled by default]
test.mm:11:14: warning: ‘...’ as arguments.) [enabled by default]
test.mm: In function ‘int main()’:
test.mm:19:28: warning: ‘Hello’ may not respond to ‘+new’ [enabled by default]
test.mm:21:14: warning: ‘Hello’ may not respond to ‘-free’ [enabled by default]

実行しようとすると、SIGSEGVが発生します。

$> ./test
$> Segmentation fault

私が間違っていることは何ですか?

env:linux-x86_64、gcc-4.7.2

ありがとう。

4

1 に答える 1

3

そのコードは間違っています。そして古代。それは決してうまくいかなかったでしょう。今はそうです(いくつかの例を修正して追加しました)。

まず、GNUStep がインストールされているかどうかを確認します。その場合は、NSObject と libFoundation を使用するように切り替えてください (実際にlibgnustep-baseは、Fred がコメントで指摘しているように)。

次に、[IIRC -- ここで古い脳細胞をスクラッチ]initオブジェクトがまだルート クラスであったときに (id) を返しました。そのメソッドでは何も役に立たないのでinit、完全に削除してください。

コンパイラ エラーは、Helloサブクラスが から正しく継承されていないことを示していますがObject、これは意味がありません。

于 2013-01-19T00:30:12.320 に答える